足力健后端,使用.netcore版本,合并1个项目使用

JsonHelper.cs 4.2KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136
  1. using Newtonsoft.Json;
  2. using Newtonsoft.Json.Converters;
  3. using Newtonsoft.Json.Linq;
  4. using System;
  5. using System.Collections.Generic;
  6. using System.Data;
  7. using System.Linq;
  8. using System.Text;
  9. namespace System.Common
  10. {
  11. public static class JsonHelper
  12. {
  13. /// <summary>
  14. /// json中的时间格式
  15. /// </summary>
  16. /// <returns></returns>
  17. public static IsoDateTimeConverter TimeFormat()
  18. {
  19. return new IsoDateTimeConverter() { DateTimeFormat = "yyyy-MM-dd HH:mm:ss" };
  20. }
  21. /// <summary>
  22. /// model转json
  23. /// </summary>
  24. public static string ObjectToJson(object obj)
  25. {
  26. //if (obj == null) { throw new Exception("null不能被转为json"); }
  27. return JsonConvert.SerializeObject(obj, TimeFormat());
  28. }
  29. /// <summary>
  30. /// model转xml
  31. /// </summary>
  32. public static string ObjectToXml(object obj, string root_name = "root")
  33. {
  34. var json = ObjectToJson(obj);
  35. var xml_json = "{\"" + root_name + "\":" + json + "}";
  36. var xml = JsonConvert.DeserializeXmlNode(xml_json).OuterXml;
  37. return xml;
  38. }
  39. /// <summary>
  40. /// 比较两个json结构是否相同
  41. /// </summary>
  42. /// <param name="json_1"></param>
  43. /// <param name="json_2"></param>
  44. /// <returns></returns>
  45. public static bool HasSameStructure(string json_1, string json_2)
  46. {
  47. var path_list = new List<string>();
  48. void FindJsonNode(JToken token)
  49. {
  50. if (token == null) { return; }
  51. if (token.Type == JTokenType.Property)
  52. {
  53. path_list.Add(token.Path);
  54. }
  55. //find next node
  56. var children = token.Children();
  57. foreach (var child in children)
  58. {
  59. FindJsonNode(child);
  60. }
  61. }
  62. FindJsonNode(JToken.Parse(json_1));
  63. FindJsonNode(JToken.Parse(json_2));
  64. path_list = path_list.Select(x => ConvertHelper.GetString(x).Trim()).ToList();
  65. //这里其实有bug
  66. //如果一个json是空,另一个是两个a.b.c(虽然不可能出现)
  67. //就会导致两个不一样的json被判断为一样
  68. //介于不太可能发生,就不想改了,什么时候c#内置函数支持ref再改(强迫症=.=)
  69. return path_list.Count == path_list.Distinct().Count() * 2;
  70. }
  71. private static void JsonParseTest(string json)
  72. {
  73. var dom = JObject.Parse(json);
  74. var mk = dom["io"];
  75. var props = dom.Properties();
  76. }
  77. /// <summary>
  78. /// json转model
  79. /// </summary>
  80. public static T JsonToEntity<T>(string json)
  81. {
  82. var b = false;
  83. if (b) { return JsonConvert.DeserializeObject<T>(json); }
  84. return (T)JsonToEntity(json, typeof(T));
  85. }
  86. /// <summary>
  87. /// json转list
  88. /// </summary>
  89. /// <typeparam name="T"></typeparam>
  90. /// <param name="Json"></param>
  91. /// <returns></returns>
  92. public static List<T> JsonToList<T>(this string Json)
  93. {
  94. return Json == null ? null : JsonConvert.DeserializeObject<List<T>>(Json);
  95. }
  96. /// <summary>
  97. /// json解析
  98. /// </summary>
  99. public static object JsonToEntity(string json, Type type)
  100. {
  101. if (!ValidateHelper.IsPlumpString(json)) { throw new Exception("json为空"); }
  102. if (type == null) { throw new Exception("请指定json对应的实体类型"); }
  103. try
  104. {
  105. return JsonConvert.DeserializeObject(json, type);
  106. }
  107. catch (Exception e)
  108. {
  109. throw new Exception($"不能将json转为{type.FullName}。json数据:{json}", e);
  110. }
  111. }
  112. /// <summary>
  113. /// datatable转json
  114. /// </summary>
  115. /// <returns>json</returns>
  116. public static string DataTableToJson(DataTable dt)
  117. {
  118. return JsonConvert.SerializeObject(dt, new DataTableConverter(), TimeFormat());
  119. }
  120. }
  121. }