在 Java 中以下 json 字符串怎么用 gson 反序列化,谢谢。 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
starry97
V2EX    Java

在 Java 中以下 json 字符串怎么用 gson 反序列化,谢谢。

  •  
  •   starry97 Jul 16, 2020 2978 views
    This topic created in 2110 days ago, the information mentioned may be changed or developed.

    本人刚学 java,选择想对这个 json 字符串反序列化,网了找了好多 demo 都失败,特来请教下大家这个该怎么反序列化,谢谢。

    { "GroupName1":{ "name1":{ "name":"li", "age":22 }, "name2":{ "name":"zhang", "age":23 } }, "GroupName2":{ "name1":{ "name":"li", "age":22 }, "name2":{ "name":"zhang", "age":23 }, "name3":{ "name":"wang", "age":22 } }, } 
    17 replies    2020-07-18 19:33:19 +08:00
    GM
        1
    GM  
       Jul 16, 2020
    定义一个结构相同的 pojo 不就可以了么?
    Jacky23333
        2
    Jacky23333  
       Jul 16, 2020 via Android
    直接看 github 上面找 gson 文档就好啦,写的很详细
    starry97
        3
    starry97  
    OP
       Jul 16, 2020
    @GM 我看文档里定义结果相同的 pojo 是需要属性和 json 字段一致才行,但这里的 GroupName 是一直变的
    starry97
        4
    starry97  
    OP
       Jul 16, 2020
    @Jacky23333 好的,我去找找,谢谢您。
    GM
        5
    GM  
       Jul 16, 2020
    直接用 Jackson 的 JsonNode 算了。
    lxk11153
        6
    lxk11153  
       Jul 16, 2020
    @starry97 "但这里的 GroupName 是一直变的"?那就反序列化到 Map 类型呀。
    Jacky23333
        7
    Jacky23333  
       Jul 16, 2020 via Android
    你这个 json 的属性名是不可以变化的,也就是说 GroupName 应该是固定的,因为你说了你要转化成 javabean 嘛,javabean 字段是固定的,那 groupName 肯定也要是固定的呀,不过我看你的需求(json 的属性名是不固定的)那你不应该转化成 javabean,而是应该转化成 Map,这样你通过 Map.keySet 去遍历所有属性了
    starry97
        8
    starry97  
    OP
       Jul 16, 2020
    感谢大家,已经解决了,还是我太菜了。
    解决方法:
    gson.fromJson(jsonStr, new TypeToken<HashMap<String, HashMap<String, JsonBean>>>(){}.getType());
    lxk11153
        9
    lxk11153  
       Jul 16, 2020
    1. com.fasterxml.jackson.databind.ObjectMapper#readValue(String, TypeReference)
    ---- new TypeReference<Map
    2. com.alibaba.fastjson.JSON#parseObject(String)
    GM
        10
    GM  
       Jul 17, 2020
    @starry97 搞那么复杂,Jackson 多好用
    ObjectMapper objectMapper = new ObjectMapper();
    JsonNode tree = objectMapper.readTree(jsonStr);

    JsonNode node = tree.get("GroupName1").get("name1");
    String name = node.get("name").asText();
    int age = node.get("age").asInt();
    Finest
        11
    Finest  
       Jul 17, 2020   1
    Map<String,Map<String,User>>

    有时候挺反感这种 Json 定义的,遇到了还得多写不少行代码,用数组不好吗
    starry97
        12
    starry97  
    OP
       Jul 17, 2020
    @GM tree.get("GroupName1").get("name1"); 这个 GroupName1 和 name1 是一直变的,可以用遍历的方法将 tree 一层一层遍历出来吗?
    starry97
        13
    starry97  
    OP
       Jul 17, 2020
    @hand515 GroupName1 里的 name 是一直变的,不好用数组表示吧
    GM
        14
    GM  
       Jul 17, 2020
    @starry97 可以
    EminemW
        15
    EminemW  
       Jul 17, 2020
    你的 json 结构应该弄成这样。我觉得你那样不太合适
    {
    "Group":[
    {
    "GroupName":"name1",
    "member":[
    {
    "name":"li",
    "age":22
    },
    {
    "name":"zhang",
    "age":23
    }
    ]
    },
    {
    "GroupName":"name2",
    "member":[
    {
    "name":"li",
    "age":2
    },
    {
    "name":"zhang",
    "age":23
    },
    {
    "name":"wang",
    "age":22
    }
    ]
    }
    ]
    }
    cco
        16
    cco  
       Jul 17, 2020
    JSON 设计也是一门艺术- -! 你这。。。。
    NotFoundEgg
        17
    NotFoundEgg  
       Jul 18, 2020
    不建议把业务参数当成 json 的 key
    偷懒一时爽 加参火葬场
    About     Help     Advertise     Blog     API     FAQ     Solana     887 Online   Highest 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 48ms UTC 22:04 PVG 06:04 LAX 15:04 JFK 18:04
    Do have faith in what you're doing.
    ubao msn 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