本人需要接收一段不知道内容的json,然后提取出里面的键值,通过这几天的查询,本人知道了可以用SortedDictionary来把json排序,
但是本人要接收的json里有数组或是嵌套json,例如:
{
“data”: [
{
“a”: “123”,
“cb”: “2323”,
“ab”: “asdf”
}
],
“acd”: “11”,
“bc”: “22”,
“ca”: {
“key”: “acce”,
“get”: “uc”
}
}
本人需要先把data和ca里面的值按照首字母排序,然后在把排好序的data,ca和acd,bc,进行排序(事先不知道键名),请教各位高手本人该怎么做呢?
但是本人要接收的json里有数组或是嵌套json,例如:
{
“data”: [
{
“a”: “123”,
“cb”: “2323”,
“ab”: “asdf”
}
],
“acd”: “11”,
“bc”: “22”,
“ca”: {
“key”: “acce”,
“get”: “uc”
}
}
本人需要先把data和ca里面的值按照首字母排序,然后在把排好序的data,ca和acd,bc,进行排序(事先不知道键名),请教各位高手本人该怎么做呢?
解决方案
5
嵌套的也是一样排序。找个功能强大点的脚本分析器。
15
本人刚试了试。先把底层的需要排序的排好。然后把第一层的排序排好。都是用Dictionary<string,string>。然后把第一层的相应的内容替换成底层的内容。最后转成json串就可以了。
排序本人就用的orderBy(Item=>item.key)
排序本人就用的orderBy(Item=>item.key)
80
{ "BankCard": { "cardNo": null, "cvv2": null, "expiryDate": null, "idNo": null, "mobileNo": null, "name": null }, "callback": "https://www.baidu.com", "Card": "", "cashier": "", "hmac": null, "Ip": "", "merchant": "123456", "notify": "https://www.baidu.com", "orderAmount": "", "orderCurrency": "CNY", "payer": { "bankCardNum": null, "email": "cc@cc.com", "idNum": "", "name": "付款人姓名", "nationality": null, "phoneNum": "13901234567", "type": "IDCARD" }, "paymentModeCode": "", "productDetails": [ { "amount": 30000, "description": "苹果6", "name": "Iphone 6", "quantity": 5, "receiver": "" } ], "remark": "备注", "requestId": "1474074837", "time": "", "Use": "", "UserId": "" }
static void Main(string[] args) { var s = File.ReadAllText("d9.txt", Encoding.Default); //数据放在文件里了,不然太多的转义眼都看花了 var a = JObject.Parse(s); var b = a.GetEnumerator(); var target = KeySort(a); s = JsonConvert.SerializeObject(target, Formatting.Indented); Console.WriteLine(s); } static SortedDictionary<string, object> KeySort(JObject obj) { var res = new SortedDictionary<string, object>(); foreach (var x in obj) { if (x.Value is JValue) res.Add(x.Key, x.Value); else if (x.Value is JObject) res.Add(x.Key, KeySort((JObject)x.Value)); else if(x.Value is JArray) { var tmp = new SortedDictionary<string, object>[x.Value.Count()]; for (var i = 0; i < x.Value.Count(); i++) { tmp[i] = KeySort((JObject)x.Value[i]); } res.Add(x.Key, tmp); } } return res; }
不过应该说明的是,排序 json 的键名是没有意义的。原因是你是按键名操作,而不是按顺序。
js 的对象的成员是按哈希表组织的,json 转换成 js 对象后,并不一定按字母顺序排列