请问不用对象,怎么处理复杂 json

2022-05-22 18:39:18 +08:00
 qiyue0726
我主要工作语言是用的 java ,偶尔想用 c#弄个桌面应用什么的,但是碰到一些问题。
就是不知道要处理比较复杂的 json ,比如一个 json 对象里面有其他对象和数组,数组里又有对象或数组。
在 java 里面基本用 map<String,Object> 然后转来转去总能拿到数据,但是在 c# 里面好像用 dictionary 只能处理一些比较简单的 json ,可能是技术所限。
搜到的基本都是建一个类去转换,但是感觉太麻烦了,请问有比较简单的处理方式吗
比如下面这样的 json


{
"name": "张三",
"age": 20,
"idCard": "123456789",
"birthday": "2021-01-01 00:00:00",
"hobbys": [
{
"sort": 1,
"desc": "写字"
},
{
"sort": 2,
"desc": "游泳"
}
]
}
2375 次点击
所在节点    C#
16 条回复
strawberryBug
2022-05-22 18:42:53 +08:00
jsonPath
xupefei
2022-05-22 18:47:31 +08:00
dynamic ?
andrew2558
2022-05-22 18:51:07 +08:00
不是可以直接反序列化吗?再复杂都可以
lukaz
2022-05-22 19:31:36 +08:00
JToken
BiChengfei
2022-05-22 20:11:16 +08:00
json 工具类反序列化都可以吧
ration
2022-05-22 21:26:57 +08:00
其实建议还是用类转化。
qiyue0726
2022-05-23 09:38:14 +08:00
@andrew2558 为什么我之前好像用 dictionary<string,ArrayList<dictionary<string,object>>> 这样的类型做转换类型,会报错,是我哪里写的有问题吗
INCerry
2022-05-23 11:45:17 +08:00
和 java 一样的 dictionary 就可以了
yuandong
2022-05-29 21:25:27 +08:00
JToken
sinnosong1
2022-05-30 09:46:34 +08:00
@qiyue0726 namespace:Newtonsoft.Json.Linq 这样写 JObject.Parse(apiResponse).SelectToken("detail").Value<string>()
qiyue0726
2022-05-31 21:26:24 +08:00
@sinnosong1 我没用过 linq ,这看起来是把 json 字符串当成数据库去查询?
sinnosong1
2022-05-31 22:08:48 +08:00
@qiyue0726 不是的,JObject.Parse()之后返回的是 JToken 对象(可以理解为 Gson 库提供的 JsonObject ),然后可以对 JToken 使用 SelectToken()方法查询这个 JToken 中的第一层属性,如果属性也是对象的话还可以继续查询。example:
var str = "{\"name\":{\"age\":1},\"address\":\"china\"}";
JObject jsonObj = JObject.Parse(str);
var age = jsonObj.SelectToken("name").SelectToken("age").Value<int>();
Console.WriteLine(age+", type:"+age.GetType());
var address=jsonObj.SelectToken("address").Value<string>();
Console.WriteLine(address+", type:"+address.GetType());
sinnosong1
2022-05-31 22:09:16 +08:00
@qiyue0726 实际就是 linq😂
forgottencoast
2022-06-02 22:45:20 +08:00
如果你想要性能,或是读取其中某些值,那就用流( Reader )来处理。
如果你需要整个 json 对象,那就用反序列化成对象。
还有像使用 HTML DOM 一样来处理的方式( Document ),如果你熟悉这个也可以用这种方式。
Kevin2
2022-06-21 13:13:04 +08:00
考虑这种方案,https://stackoverflow.com/questions/19645501/searching-for-a-specific-jtoken-by-name-in-a-jobject-hierarchy 在这个基础上自己又封装了一个帮助类。
ColinZeb
2022-07-29 16:08:49 +08:00
@sinnosong1 这不是 linq ,这是动态对象

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/854519

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX