常用

  • 获取时区分大小写
  • jobject.ToString()
  • jobject.ToObject<T>()
  • jobject.ContainsKey("ddd")
    1. if (!data.ContainsKey("deviceIndex") || data["deviceIndex"] == null)
    2. {
    3. response.Message = "上报数据错误,请检查:deviceIndex";
    4. return response;
    5. }

    JToken:用于存放Linq to JSON查询后的结果

  1. //jObj.ToString()
  2. //将json转换为JObject
  3. JObject jObj = JObject.Parse(json);
  4. JToken colleagues = jObj["Colleagues"];
  5. colleagues[0]["Age"] = 45;
  6. jObj["Colleagues"] = colleagues;//修改后,再赋给对象
  7. Console.WriteLine(**jObj.ToString()**);

dynamic

dynamic是C#里面的动态类型,可在未知类型的情况访问对应的属性,非常灵活和方便。 使用Json.Net可以把一个Json字符串转换成一个JObject对象,如果有已知强类型,如果有已知对应的强类型,可以直接转成对应的类型。但如果没有,要访问Json里面对应的数据的时候,就显得比较麻烦。我们可以借助DynamicObject来访问对应的属性。

DynamicObject

  • 我们要创建一个动态类,用于访问JObject
  1. public class JObjectAccessor : DynamicObject
  2. {
  3. JToken obj;
  4. public JObjectAccessor(JToken obj)
  5. {
  6. this.obj = obj;
  7. }
  8. public override bool TryGetMember(GetMemberBinder binder, out object result)
  9. {
  10. result = null;
  11. if (obj == null) return false;
  12. var val = obj[binder.Name];
  13. if (val == null) return false;
  14. result = Populate(val);
  15. return true;
  16. }
  17. private object Populate(JToken token)
  18. {
  19. var jval = token as JValue;
  20. if (jval != null)
  21. {
  22. return jval.Value;
  23. }
  24. else if (token.Type == JTokenType.Array)
  25. {
  26. var objectAccessors = new List<object>();
  27. foreach (var item in token as JArray)
  28. {
  29. objectAccessors.Add(Populate(item));
  30. }
  31. return objectAccessors;
  32. }
  33. else
  34. {
  35. return new JObjectAccessor(token);
  36. }
  37. }
  38. }
  • 接下来就可以开始使用它了
  1. string json = @"{'name': 'Jeremy Dorn','location': {'city': 'San Francisco','state': 'CA'},'pets': [{'type': 'dog','name': 'Walter'}]}";
  2. JObject jobj = JObject.Parse(json);
  3. dynamic obj = new JObjectAccessor(jobj);
  4. Console.WriteLine($"{obj.name}: {obj.location.city} {obj.location.state}");
  5. Console.WriteLine($"{obj.pets[0].type}: {obj.pets[0].name}");

参考文章