本人需要接收一段不知道内容的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 对象后,并不一定按字母顺序排列