在c#中如何将json里的值提取出来根据键名首字母把键值进行排序

阿斯蒂芬范德萨 2016-09-26 10:52:05
我需要接收一段不知道内容的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,进行排序(事先不知道键名),求教各位大神我该怎么做呢?
...全文
1419 58 打赏 收藏 转发到动态 举报
写回复
用AI写文章
58 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
引用 55 楼 xuzuning 的回复:
拼接什么? 重新编码据可以了 s = JsonConvert.SerializeObject(target, Formatting.Indented); 就是我给出的带缩进的格式 s = JsonConvert.SerializeObject(target); 就是你要的紧凑格式
大神 新帖链接:http://bbs.csdn.net/topics/392026650?page=1#post-401635393
  • 打赏
  • 举报
回复
引用 55 楼 xuzuning 的回复:
拼接什么? 重新编码据可以了 s = JsonConvert.SerializeObject(target, Formatting.Indented); 就是我给出的带缩进的格式 s = JsonConvert.SerializeObject(target); 就是你要的紧凑格式
这个拼接我感觉是把已经在dictionary里排序好的值直接从头到位拼接最好,要不我先把这个贴结了,再开一帖,邀请你。
  • 打赏
  • 举报
回复
引用 55 楼 xuzuning 的回复:
拼接什么? 重新编码据可以了 s = JsonConvert.SerializeObject(target, Formatting.Indented); 就是我给出的带缩进的格式 s = JsonConvert.SerializeObject(target); 就是你要的紧凑格式
额 大神 其实我的最终目的是把根据首字母排序好的参数然后把他们的键值从头到位拼接起来
xuzuning 2016-09-29
  • 打赏
  • 举报
回复
没有两个方法呀 static void Main(string[] args) 只是控制台程序的入口 var s = File.ReadAllText("d9.txt", Encoding.Default); //这是获取 json 数据,你根据你的情况修改 var a = JObject.Parse(s); //将 s 中的 json 解码 var target = KeySort(a); //排序解码后的 JObject 对象 带转义符的 json 串,贴在编辑器里,使用时自然就没有了
  • 打赏
  • 举报
回复
引用 36 楼 xuzuning 的回复:
不明白你是什么意思 json 是字符串,怎么会是 string[] 呢? 正常的 json 串是没有转义符的(除了字符 / 会有),如果你的有,显然是不对的(js 也不认) 需要删除 \ 字符后再行解码
那你这两个方法我该怎么调用呢 上面那个方法要string[]类型的参数
xuzuning 2016-09-29
  • 打赏
  • 举报
回复
不明白你是什么意思 json 是字符串,怎么会是 string[] 呢? 正常的 json 串是没有转义符的(除了字符 / 会有),如果你的有,显然是不对的(js 也不认) 需要删除 \ 字符后再行解码
  • 打赏
  • 举报
回复
引用 34 楼 xuzuning 的回复:
哦,第 5 行的 var b = a.GetEnumerator(); 应该删去
大神,我的json串是string类型而且带反斜杠的 我该怎么改成string[]呢
xuzuning 2016-09-29
  • 打赏
  • 举报
回复
拼接什么? 重新编码据可以了 s = JsonConvert.SerializeObject(target, Formatting.Indented); 就是我给出的带缩进的格式 s = JsonConvert.SerializeObject(target); 就是你要的紧凑格式
  • 打赏
  • 举报
回复
引用 52 楼 xuzuning 的回复:
没有问题
{
  "bankCard": {
    "cardNo": null,
    "cvv2": null,
    "expiryDate": null,
    "idNo": null,
    "mobileNo": null,
    "name": null
  },
  "bindCard": "",
  "cashier": "",
  "Hmac": null,
  "Ip": "",
  "merchant": "123456",
  "notify": "",
  "orderAmount": "",
  "orderCurrency": "CNY",
  "payer": {
    "bankCardNum": null,
    "email": "cc@cc.com",
    "idNum": "",
    "idType": "IDCARD",
    "name": "付款人姓名",
    "nationality": null,
    "phoneNum": ""
  },
  "payment": "",
  "productDetails": [
    {
      "amount": 30000,
      "description": "苹果6",
      "name": "Iphone 6",
      "quantity": 5,
      "receiver": "易汇金"
    }
  ],
  "remark": "备注",
  "requestId": "1475142274858",
  "time": "",
  "Url": "",
  "Use": "",
  "UserId": ""
}
把 , Encoding.Default 去掉试试 你的文件是 utf-8 的,我这里加不加都一样 对于 gbk 的文件才要加
大神 我循环输出出来的是怎么成这样了.... "System.Collections.Generic.SortedDictionary`2[System.String,System.Object]https://www.baidu.com123456https://www.baidu.comCNYSystem.Collections.Generic.SortedDictionary`2[System.String,System.Object]System.Collections.Generic.SortedDictionary`2[System.String,System.Object][]备注1474074837" 代码: System.Text.StringBuilder sbHmac = new System.Text.StringBuilder(); foreach (KeyValuePair<string,object> item in target) { sbHmac.Append(item.Value); }
  • 打赏
  • 举报
回复
引用 52 楼 xuzuning 的回复:
没有问题
{
  "bankCard": {
    "cardNo": null,
    "cvv2": null,
    "expiryDate": null,
    "idNo": null,
    "mobileNo": null,
    "name": null
  },
  "bindCard": "",
  "cashier": "",
  "Hmac": null,
  "Ip": "",
  "merchant": "123456",
  "notify": "",
  "orderAmount": "",
  "orderCurrency": "CNY",
  "payer": {
    "bankCardNum": null,
    "email": "cc@cc.com",
    "idNum": "",
    "idType": "IDCARD",
    "name": "付款人姓名",
    "nationality": null,
    "phoneNum": ""
  },
  "payment": "",
  "productDetails": [
    {
      "amount": 30000,
      "description": "苹果6",
      "name": "Iphone 6",
      "quantity": 5,
      "receiver": "易汇金"
    }
  ],
  "remark": "备注",
  "requestId": "1475142274858",
  "time": "",
  "Url": "",
  "Use": "",
  "UserId": ""
}
把 , Encoding.Default 去掉试试 你的文件是 utf-8 的,我这里加不加都一样 对于 gbk 的文件才要加
大神 好了 剩下的就是把所有值前后拼接了,我自己试试循环拼接,太感谢了
xuzuning 2016-09-29
  • 打赏
  • 举报
回复
没有问题
{
  "bankCard": {
    "cardNo": null,
    "cvv2": null,
    "expiryDate": null,
    "idNo": null,
    "mobileNo": null,
    "name": null
  },
  "bindCard": "",
  "cashier": "",
  "Hmac": null,
  "Ip": "",
  "merchant": "123456",
  "notify": "",
  "orderAmount": "",
  "orderCurrency": "CNY",
  "payer": {
    "bankCardNum": null,
    "email": "cc@cc.com",
    "idNum": "",
    "idType": "IDCARD",
    "name": "付款人姓名",
    "nationality": null,
    "phoneNum": ""
  },
  "payment": "",
  "productDetails": [
    {
      "amount": 30000,
      "description": "苹果6",
      "name": "Iphone 6",
      "quantity": 5,
      "receiver": "易汇金"
    }
  ],
  "remark": "备注",
  "requestId": "1475142274858",
  "time": "",
  "Url": "",
  "Use": "",
  "UserId": ""
}
把 , Encoding.Default 去掉试试 你的文件是 utf-8 的,我这里加不加都一样 对于 gbk 的文件才要加
  • 打赏
  • 举报
回复
引用 49 楼 xuzuning 的回复:
问题是:var a = JObject.Parse(s); //运行到这句就会报错 也就是 json 根本就解析不了,自然就谈不上排序了 你把你的 json.txt 传到网盘上 不要贴内容了,我用你 #32 贴出的内容测试通过
大神 我刚才试了#32的内容,productDetails过去了,但是从payer.name那里卡住了
  • 打赏
  • 举报
回复
引用 49 楼 xuzuning 的回复:
问题是:var a = JObject.Parse(s); //运行到这句就会报错 也就是 json 根本就解析不了,自然就谈不上排序了 你把你的 json.txt 传到网盘上 不要贴内容了,我用你 #32 贴出的内容测试通过
链接: http://pan.baidu.com/s/1eSJTYs6 密码: 93nh
xuzuning 2016-09-29
  • 打赏
  • 举报
回复
问题是:var a = JObject.Parse(s); //运行到这句就会报错 也就是 json 根本就解析不了,自然就谈不上排序了 你把你的 json.txt 传到网盘上 不要贴内容了,我用你 #32 贴出的内容测试通过
  • 打赏
  • 举报
回复
引用 45 楼 xuzuning 的回复:
他是在解析这一段时出现了问题 "productDetails":[{"name":"Iphone 6","quantity":5,"amount":30000,"receiver":"","description":"苹果6"}]
你把数据好好检查一下
  • 打赏
  • 举报
回复
引用 45 楼 xuzuning 的回复:
他是在解析这一段时出现了问题 "productDetails":[{"name":"Iphone 6","quantity":5,"amount":30000,"receiver":"","description":"苹果6"}] 你把数据好好检查一下
额 不好意思 好像没办法再加分了
  • 打赏
  • 举报
回复
引用 45 楼 xuzuning 的回复:
他是在解析这一段时出现了问题 "productDetails":[{"name":"Iphone 6","quantity":5,"amount":30000,"receiver":"","description":"苹果6"}] 你把数据好好检查一下
大神 我这个数据没什么问题的 如果去掉了这个productDetails也会在payer那里卡住,实在不知道为什么,这样吧 大神 我和你说一下我想完成的东西 您帮忙看看这个我该怎么实现: 我需要把这个json里的值根据键名的首字母进行a-z的排序,排序以后把键值首位拼接,这样就行了 我现在就是想用一个自动排序然后拼接数据的方法,以后实体类里添加东西也就不用进行更改加密方法了 求帮忙帮忙 可以加100分
xuzuning 2016-09-29
  • 打赏
  • 举报
回复
他是在解析这一段时出现了问题 "productDetails":[{"name":"Iphone 6","quantity":5,"amount":30000,"receiver":"","description":"苹果6"}] 你把数据好好检查一下
  • 打赏
  • 举报
回复
引用 43 楼 diaodiaop 的回复:
说了这么多,其实我想问的是.你格式化了排序了之后的意义在哪呢? 也就是 你给客户端返回{"a":"a";"b":"b"}跟{"b":"b";"a":"a"} 有什么区别吗? 难道客户端对于这样的情况 是2种,后者无法解析? 这样的客户端 你不跟他合作也罢.
不是的 ,我是需要把这个排序以后按照排好的顺序把所有的值前后拼接起来一起进行md5加密,由于后续可能要加参数,也不想改动加密的代码了,所以需要一个自动排序的功能,嵌套数组先进行排序然后外层再进行排序
by_封爱 版主 2016-09-29
  • 打赏
  • 举报
回复
说了这么多,其实我想问的是.你格式化了排序了之后的意义在哪呢? 也就是 你给客户端返回{"a":"a";"b":"b"}跟{"b":"b";"a":"a"} 有什么区别吗? 难道客户端对于这样的情况 是2种,后者无法解析? 这样的客户端 你不跟他合作也罢.
加载更多回复(38)

110,536

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧