通常我正在使用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"}]
答案 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 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);
从您的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;
尝试一次,可能对您有帮助。