请问不用对象,怎么处理复杂 json - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
qiyue0726
V2EX    C#

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

  •  
  •   qiyue0726 2022-05-22 18:39:18 +08:00 3034次点击
    这是一个创建于 1237 天前的主题,其中的信息可能已经有所发展或是发生改变。
    我主要工作语言是用的 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": "游泳"
    }
    ]
    }
    16 条回复    2022-07-29 16:08:49 +08:00
    strawberryBug
        1
    strawberryBug  
       2022-05-22 18:42:53 +08:00 via Android
    jsonPath
    xupefei
        2
    xupefei  
       2022-05-22 18:47:31 +08:00 via iPhone
    dynamic ?
    andrew2558
        3
    andrew2558  
       2022-05-22 18:51:07 +08:00
    不是可以直接反序列化吗?再复杂都可以
    lukaz
        4
    lukaz  
       2022-05-22 19:31:36 +08:00 via iPhone
    JToken
    BiChengfei
        5
    BiChengfei  
       2022-05-22 20:11:16 +08:00   1
    json 工具类反序列化都可以吧
    ration
        6
    ration  
       2022-05-22 21:26:57 +08:00 via Android
    其实建议还是用类转化。
    qiyue0726
        7
    qiyue0726  
    OP
       2022-05-23 09:38:14 +08:00
    @andrew2558 为什么我之前好像用 dictionary<string,ArrayList<dictionary<string,object>>> 这样的类型做转换类型,会报错,是我哪里写的有问题吗
    INCerry
        8
    INCerry  
       2022-05-23 11:45:17 +08:00
    和 java 一样的 dictionary 就可以了
    yuandong
        9
    yuandong  
       2022-05-29 21:25:27 +08:00
    JToken
    sinnosong1
        10
    sinnosong1  
       2022-05-30 09:46:34 +08:00
    @qiyue0726 namespace:Newtonsoft.Json.Linq 这样写 JObject.Parse(apiResponse).SelectToken("detail").Value<string>()
    qiyue0726
        11
    qiyue0726  
    OP
       2022-05-31 21:26:24 +08:00
    @sinnosong1 我没用过 linq ,这看起来是把 json 字符串当成数据库去查询?
    sinnosong1
        12
    sinnosong1  
       2022-05-31 22:08:48 +08:00   1
    @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
        13
    sinnosong1  
       2022-05-31 22:09:16 +08:00
    @qiyue0726 实际就是 linq
    forgottencoast
        14
    forgottencoast  
       2022-06-02 22:45:20 +08:00
    如果你想要性能,或是读取其中某些值,那就用流( Reader )来处理。
    如果你需要整个 json 对象,那就用反序列化成对象。
    还有像使用 HTML DOM 一样来处理的方式( Document ),如果你熟悉这个也可以用这种方式。
    Kevin2
        15
    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
        16
    ColinZeb  
       2022-07-29 16:08:49 +08:00
    @sinnosong1 这不是 linq ,这是动态对象
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     6036 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 43ms UTC 02:33 PVG 10:33 LAX 19:33 JFK 22:33
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86