Несогласованный JSON

Я пытаюсь разобрать JSON на С#, что несовместимо, т.е. Ниже приведен пример JSON, который я получаю.

    {
    "Timestamp" : "2019-05-09T11:24:25.000Z",
    "Channel" : "web",
    "Supplier" : "kunde",
    "Generator" : "survey",
    "Type" : "hudtest",
    "Data" :{
        "Alder" : "20-29",
        "Køn" : "Kvinde",
        "Hudtype" : "sensitiv",
        "Hudtilstand" : "mixet"
       }
}

и вариант этого JSON выглядит следующим образом:

    {
    "Timestamp" : "2019-05-09T11:24:25.000Z",
    "Channel" : "web",
    "Supplier" : "kunde",
    "Generator" : "survey",
    "Type" : "hudtest",
    "Data" :{
        "Alder" : "20-29",
        "Køn" : "Kvinde",
        "Hudtype" : "sensitiv",
        "Hudtilstand" : "mixet",
        "materialistID" : 61234,
        "Anbefalede produkter" : [ 100225, 725125 ]
    }
}

Как вы можете видеть в обоих примерах, у меня разные значения в ключе Data. Как я могу разобрать этот JSON на С#?

К вашему сведению: ключ Data может иметь значение, отличное от приведенного выше примера. Не только "Anbefalede produkter. Он может содержать несколько различных значений. Я пытался сделать это dynamic или преобразовать в anonymous тип. Но я также хочу проверить свою схему JSON. За исключением ключа Data, другие ключи должны быть проверены, и они являются обязательными.

Так разница в том, что есть необязательные поля? Большинство, если не все парсеры JSON будут поддерживать это - в первом случае вы просто получите нулевой продукт Anbefalede. Или вы хотите преобразовать данные в динамический объект, который будет принимать любые значения?

Rup 28.05.2019 19:31

Это на самом деле другое, или иногда есть просто пустые свойства?

Jakob Busk Sørensen 28.05.2019 19:32

Одним из вариантов было бы разобрать его на Dictionary<string, object>. Это зависит от того, насколько динамичны различия.

user47589 28.05.2019 19:32

Или вы можете создать две отдельные модели для анализа обоих случаев. Или вы можете создать только одну модель и добавить все поля, в каждом случае дополнительное поле получит нулевое значение, и при использовании вы можете иметь ту же проверку.

Harsh Raj 28.05.2019 19:33

@HarshRaj Я понятия не имею, какие параметры будут включены в ключ Data. это вопрос для меня. Ключ Data будет иметь несовместимые значения.

Shabir jan 28.05.2019 19:34

Сделайте это dynamic тогда.

Ofiris 28.05.2019 19:37

Хорошо, но я также хочу проверить свой json, кроме ключа данных, другие ключи должны быть проверены. Как я могу это сделать, если я это сделаю dynamic?

Shabir jan 28.05.2019 19:39

Не делайте это динамичным. Использование Dictionary<string, object> имеет больше смысла, чем динамическое, почти в каждом сценарии.

Joe Phillips 28.05.2019 19:42

@JoePhillips Хорошо, но как мне проверить свой JSON, когда я обновил свой вопрос. Мне нужно проверить мой JSON, так как другие ключи, кроме Data, являются обязательными.

Shabir jan 28.05.2019 19:43

@Shabirjan Вы хотите выполнить проверку модели? У вас есть модель, которой вы можете поделиться с нами?

Joe Phillips 28.05.2019 19:45

@JoePhillips Нет, вот где я запутался, как мне построить модель, в которой один из ключей имеет противоречивые значения.

Shabir jan 28.05.2019 19:57

@Shabirjan Вы используете asp.net? Он имеет встроенную проверку модели, в противном случае вы, вероятно, захотите изучить класс System.ComponentModel.DataAnnotations.Validator.

Joe Phillips 28.05.2019 20:23

@JoePhillips Я использую .net core. Я очень новичок в C#, поэтому, если вы можете мне помочь, как я могу проверить свой JSON. то есть, если какой-либо из ключей, упомянутых выше, отсутствует или содержит нулевое значение, синтаксический анализ должен завершиться ошибкой.

Shabir jan 28.05.2019 20:26

Давайте продолжить обсуждение в чате.

Joe Phillips 28.05.2019 20:54
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
14
236
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете сделать так

      class Program
    {
        static void Main(string[] args)
        {

            string jsonData = @"{  'Timestamp': '2019-05-09T11:24:25.000Z',
    'Channel': 'web',
    'Supplier': 'kunde',
    'Generator': 'survey',
    'Type': 'hudtest',
    'Data': {
        'Alder': '20-29',
        'Køn': 'Kvinde',
        'Hudtype': 'sensitiv',
        'Hudtilstand': 'mixet',
        'materialistID': 61234,
        'Anbefalede produkter': [100225, 725125]
    }
}";

            var b = JsonConvert.DeserializeObject<Rootobject>(jsonData);

            //Console.WriteLine(b.Data.Hudtype);
            //or
            Console.WriteLine(b.Data["Hudtype"]);

            Console.ReadKey();

        }

    }

    public class Rootobject
    {
        public DateTime Timestamp { get; set; }
        public string Channel { get; set; }
        public string Supplier { get; set; }
        public string Generator { get; set; }
        public string Type { get; set; }
        public Dictionary<string, object> Data { get; set; }
    }

Надеюсь, это решит вашу проблему. Спасибо

Для проверки вам необходимо знать имена ключей, которые входят в данные.

Harsh Raj 28.05.2019 19:56

Замените dynamic на Dictionary<string, object>, и я соглашусь с этим. Вы не можете полагаться на валидатор модели, чтобы понять эти данные. Вам нужно проверить его вручную, потому что он динамический. Если вы хотите, чтобы проверка модели выполняла всю работу, не разрешайте динамические данные. В качестве альтернативы вы можете использовать базовый класс или интерфейс, который имеет только общие свойства и проверять их.

Joe Phillips 28.05.2019 20:01

сделал необходимые изменения в соответствии с вашим предложением @JoePhillips

Harsh Raj 28.05.2019 20:05

@JoePhillips Спасибо за ваш вклад. Допустим, мне нужно проверить только TimeStamp, Channel, Supplier, Generator, Type из моей схемы JSON. Как это лучше всего сделать. Я просто игнорирую Data, поскольку это единственная часть, содержащая динамический контент.

Shabir jan 28.05.2019 20:11

Другие вопросы по теме