Как десериализовать объект, который я не знаю - PullRequest
0 голосов
/ 25 августа 2018

Обычно я использую Newtonsoft для десериализации следующим образом

List<myObject> deserializeObj = JsonConvert.DeserializeObject<List<myObject>>(mysample);

Но теперь я сталкиваюсь с проблемой, когда атрибут mysample может быть динамическим, а именно пользователь определяет себя. Таким образом, я не могу больше использовать myObject, так как это фиксированный класс. Так как же я могу десериализовать объект таким образом?

Например, mysample может быть что-то вроде ниже и т.д:

[{"Name":"a","Phone":"a","Ic":"a"},{"Name":"b","Phone":"b","Ic":"b"}]

OR

[{"Id":"a"},{"Id":"b"}]
  • Target Framework - это .NET Framework 3.5

Ответы [ 3 ]

0 голосов
/ 25 августа 2018

Чтобы избежать использования динамического, вы можете проанализировать JSON с помощью JArray

JArray array = JArray.Parse(json);
0 голосов
/ 25 августа 2018

Таким образом, я больше не могу использовать myObject, так как это фиксированный класс. Так как же я могу десериализовать такой объект?

Чтобы избавиться от этой проблемы Newtonsoft.Json имеет очень хорошую функцию, которую мы можем использовать

Если вы не знаете, какой json object или array взят из вашего ресурса. означает, что вы не можете определить его соответствующий объект c #, тогда newtonsoft имеет JObject и JArray может справиться с этой проблемой, как

1) Предположим, что ваша строка json object как

var json = @"{ 'Name':'a','Phone':'a','Ic':'a'}";

Тогда вы можете использовать JObject здесь

JObject jObject = JsonConvert.DeserializeObject<JObject>(json);

2) Предположим, что ваша строка json array как

var json1 = @"[{ 'Name':'a','Phone':'a','Ic':'a'},{ 'Name':'b','Phone':'b','Ic':'b'}]";

Тогда вы можете использовать JArray здесь

JArray jArray = JsonConvert.DeserializeObject<JArray>(json1);

После успешного получения JArray из строки json. Вы также можете запросить свой десериализованный объект, чтобы получить от него конкретный object, например

JObject jObject1 = jArray.Children<JObject>().FirstOrDefault(); 

JObject jObject2 = jArray.Children<JObject>().FirstOrDefault(x => x["Name"] != null && x["Name"].ToString() == "a");

int count = jArray.Children<JObject>().Count();

Если вы хотите получить определенную пару key:value от вашего json, вы можете получить ее по следующему коду

JProperty jProperty = jObject1.Properties().Where(x => x.Name == "Name").FirstOrDefault();
var value = (string)jProperty.Value; 

Попробуйте один раз, может это вам поможет.

0 голосов
/ 25 августа 2018

вы можете использовать динамический тип

List<dynamic> deserializeObj = JsonConvert.DeserializeObject<List<dynamic>>(mysample);

.NET Framework 3.5:

List<object> deserializeObj = JsonConvert.DeserializeObject<List<object>>(mysample);

тогда вы можете использовать отражение для доступа к значению

образец:

System.Reflection.PropertyInfo pi = item.GetType().GetProperty("name"); 
String name = (String)(pi.GetValue(item, null));

Не забудьте добавить с помощью System.Reflection;

...