Я пытаюсь разобрать 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
, другие ключи должны быть проверены, и они являются обязательными.
Это на самом деле другое, или иногда есть просто пустые свойства?
Одним из вариантов было бы разобрать его на Dictionary<string, object>
. Это зависит от того, насколько динамичны различия.
Или вы можете создать две отдельные модели для анализа обоих случаев. Или вы можете создать только одну модель и добавить все поля, в каждом случае дополнительное поле получит нулевое значение, и при использовании вы можете иметь ту же проверку.
@HarshRaj Я понятия не имею, какие параметры будут включены в ключ Data
. это вопрос для меня. Ключ Data
будет иметь несовместимые значения.
Сделайте это dynamic
тогда.
Хорошо, но я также хочу проверить свой json, кроме ключа данных, другие ключи должны быть проверены. Как я могу это сделать, если я это сделаю dynamic
?
Не делайте это динамичным. Использование Dictionary<string, object> имеет больше смысла, чем динамическое, почти в каждом сценарии.
@JoePhillips Хорошо, но как мне проверить свой JSON, когда я обновил свой вопрос. Мне нужно проверить мой JSON, так как другие ключи, кроме Data
, являются обязательными.
@Shabirjan Вы хотите выполнить проверку модели? У вас есть модель, которой вы можете поделиться с нами?
@JoePhillips Нет, вот где я запутался, как мне построить модель, в которой один из ключей имеет противоречивые значения.
@Shabirjan Вы используете asp.net? Он имеет встроенную проверку модели, в противном случае вы, вероятно, захотите изучить класс System.ComponentModel.DataAnnotations.Validator.
@JoePhillips Я использую .net core. Я очень новичок в C#, поэтому, если вы можете мне помочь, как я могу проверить свой JSON. то есть, если какой-либо из ключей, упомянутых выше, отсутствует или содержит нулевое значение, синтаксический анализ должен завершиться ошибкой.
Давайте продолжить обсуждение в чате.
Вы можете сделать так
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; }
}
Надеюсь, это решит вашу проблему. Спасибо
Для проверки вам необходимо знать имена ключей, которые входят в данные.
Замените dynamic
на Dictionary<string, object>
, и я соглашусь с этим. Вы не можете полагаться на валидатор модели, чтобы понять эти данные. Вам нужно проверить его вручную, потому что он динамический. Если вы хотите, чтобы проверка модели выполняла всю работу, не разрешайте динамические данные. В качестве альтернативы вы можете использовать базовый класс или интерфейс, который имеет только общие свойства и проверять их.
сделал необходимые изменения в соответствии с вашим предложением @JoePhillips
@JoePhillips Спасибо за ваш вклад. Допустим, мне нужно проверить только TimeStamp
, Channel
, Supplier
, Generator
, Type
из моей схемы JSON. Как это лучше всего сделать. Я просто игнорирую Data
, поскольку это единственная часть, содержащая динамический контент.
Так разница в том, что есть необязательные поля? Большинство, если не все парсеры JSON будут поддерживать это - в первом случае вы просто получите нулевой продукт Anbefalede. Или вы хотите преобразовать данные в динамический объект, который будет принимать любые значения?