Как десериализовать объект, который я не знаю

Обычно я использую Newtonsoft для десериализации, как это

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

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

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

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

ИЛИ ЖЕ

[{"Id":"a"},{"Id":"b"}]
  • Целевая платформа.NET Framework 3.5

3 ответа

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

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;

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

JArray array = JArray.Parse(json);

Таким образом, я не могу больше использовать 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; 

Попробуй, может, тебе это поможет.

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