Как десериализовать объект, который я не знаю
Обычно я использую 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;
Попробуй, может, тебе это поможет.