如何反序列化我不知道的对象

时间:2018-08-25 03:31:20

标签: c# json.net deserialization

通常我正在使用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"}]
  • 目标框架是.NET Framework 3.5

3 个答案:

答案 0 :(得分:2)

您可以使用动态类型

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));

dotnt忘记使用System.Reflection添加;

答案 1 :(得分:1)

为避免使用动态,可以使用JArray解析json

JArray array = JArray.Parse(json);

答案 2 :(得分:0)

  

因此我不再可以使用myObject,因为它是固定类。那么我该如何反序列化对象呢?

要摆脱这个问题,Newtonsoft.Json具有很好的功能,我们可以使用

如果您不知道哪个json objectarray来自您的资源。意味着您无法确定其c#各自的对象,则newtonsoft拥有JObjectJArray可以像这样处理此问题

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);

从您的json字符串成功获取JArray后。您还可以查询反序列化的对象,以像

一样从中获取特定的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();

如果您想从json中获取特定的key:value对,则可以通过以下代码获取它

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

尝试一次,可能对您有帮助。