V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
qiyue0726
V2EX  ›  C#

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

  •  
  •   qiyue0726 · 2022-05-22 18:39:18 +08:00 · 2666 次点击
    这是一个创建于 953 天前的主题,其中的信息可能已经有所发展或是发生改变。
    我主要工作语言是用的 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   ·   实用小工具   ·   988 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 20:37 · PVG 04:37 · LAX 12:37 · JFK 15:37
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.