1 /// <summary>
2 /// json转换为键值对辅助类
3 /// </summary>
4 public class JsonParser
5 {
6
7 private static Dictionary<string, string> lst_KeyValueData = null;
8
9 public static Dictionary<string, string> SplitJsonStringToKeyValuePairs(string jsonStr)
10 {
11 char jsonBeginToken = '{';
12 char jsonEndToken = '}';
13
14 if (string.IsNullOrEmpty(jsonStr))
15 {
16 return null;
17 }
18 //验证json字符串格式
19 if (jsonStr[0] != jsonBeginToken || jsonStr[jsonStr.Length - 1] != jsonEndToken)
20 {
21 throw new ArgumentException("非法的Json字符串!");
22 }
23
24 lst_KeyValueData = new Dictionary<string, string>();
25
26 JObject jobj = new JObject();
27
28 // 转换为json对象
29 jobj = JObject.Parse(jsonStr);
30 ParseJsonProperties(jobj);
31
32 return lst_KeyValueData;
33
34 }
35
36
37 private static void ParseJsonProperties(JObject jObject)
38 {
39 IEnumerable<JProperty> jObject_Properties = jObject.Properties();
40
41 JTokenType[] validPropertyValueTypes = { JTokenType.String, JTokenType.Integer, JTokenType.Float, JTokenType.Boolean, JTokenType.Null, JTokenType.Date, JTokenType.Bytes, JTokenType.Guid, JTokenType.Uri, JTokenType.TimeSpan };
42 List<JTokenType> propertyTypes = new List<JTokenType>(validPropertyValueTypes);
43
44 JTokenType[] validObjectTypes = { JTokenType.String, JTokenType.Array, JTokenType.Object };
45 List<JTokenType> objectTypes = new List<JTokenType>(validObjectTypes);
46
47
48
49 foreach (JProperty property in jObject_Properties)
50 {
51
52
53 try
54 {
55 if (propertyTypes.Contains(property.Value.Type))
56 {
57 ParseJsonKeyValue(property, property.Name.ToString());
58 }
59 else if (objectTypes.Contains(property.Value.Type))
60 {
61 //Arrays ex. { names: ["first": "John", "last" : "doe"]}
62 if (property.Value.Type == JTokenType.Array && property.Value.HasValues)
63 {
64 ParseJsonArray(property);
65 }
66
67 //Objects ex. { name: "john"}
68 if (property.Value.Type == JTokenType.Object)
69 {
70 JObject jo = new JObject();
71 jo = JObject.Parse(property.Value.ToString());
72 string paramName = property.Name.ToString();
73
74 lst_KeyValueData.Add(paramName, property.Value.ToString());
75
76 if (jo.HasValues)
77 {
78 ParseJsonProperties(jo);
79 }
80
81 }
82 }
83 }
84 catch (Exception ex)
85 {
86 throw;
87 }
88 } // End of ForEach
89
90
91
92 }
93
94 private static void ParseJsonKeyValue(JProperty item, string paramName)
95 {
96 lst_KeyValueData.Add(paramName, item.Value.ToString());
97 }
98
99 private static void ParseJsonArray(JProperty item)
100 {
101 JArray jArray = (JArray)item.Value;
102
103 string paramName = item.Name.ToString();
104 lst_KeyValueData.Add(paramName, item.Value.ToString());
105
106
107
108 try
109 {
110 for (int i = 0; i < jArray.Count; i++)
111 {
112
113 paramName = i.ToString();
114 lst_KeyValueData.Add(paramName, jArray.Values().ElementAt(i).ToString());
115
116 JObject jo = new JObject();
117 jo = JObject.Parse(jArray[i].ToString());
118 IEnumerable<JProperty> jArrayEnum = jo.Properties();
119
120 foreach (JProperty jaItem in jArrayEnum)
121 {
122 var paramNameWithJaItem = jaItem.Name.ToString();
123
124 var itemValue = jaItem.Value.ToString(Formatting.None);
125 if (itemValue.Length > 0)
126 {
127 switch (itemValue.Substring(0, 1))
128 {
129 case "[":
130 //Recusion call to itself
131 ParseJsonArray(jaItem);
132 break;
133 case "{":
134 //Create a new JObject and parse
135 JObject joObject = new JObject();
136 joObject = JObject.Parse(itemValue);
137
138 //For this value, reparse from the top
139 ParseJsonProperties(joObject);
140 break;
141 default:
142 ParseJsonKeyValue(jaItem, paramNameWithJaItem);
143 break;
144 }
145 }
146 }
147 } //end for loop
148
149 }
150 catch (Exception ex)
151 {
152 throw;
153 }
154 }
155 }