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

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

  •  
  •   starry97 · 2020-07-16 22:57:43 +08:00 · 2284 次点击
    这是一个创建于 1615 天前的主题,其中的信息可能已经有所发展或是发生改变。

    本人刚学 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 条回复    2020-07-18 19:33:19 +08:00
    GM
        1
    GM  
       2020-07-16 23:00:48 +08:00
    定义一个结构相同的 pojo 不就可以了么?
    Jacky23333
        2
    Jacky23333  
       2020-07-16 23:01:09 +08:00 via Android
    直接看 github 上面找 gson 文档就好啦,写的很详细
    starry97
        3
    starry97  
    OP
       2020-07-16 23:04:56 +08:00
    @GM 我看文档里定义结果相同的 pojo 是需要属性和 json 字段一致才行,但这里的 GroupName 是一直变的
    starry97
        4
    starry97  
    OP
       2020-07-16 23:05:21 +08:00
    @Jacky23333 好的,我去找找,谢谢您。
    GM
        5
    GM  
       2020-07-16 23:21:33 +08:00
    直接用 Jackson 的 JsonNode 算了。
    lxk11153
        6
    lxk11153  
       2020-07-16 23:22:02 +08:00
    @starry97 "但这里的 GroupName 是一直变的"?那就反序列化到 Map 类型呀。
    Jacky23333
        7
    Jacky23333  
       2020-07-16 23:24:14 +08:00 via Android
    你这个 json 的属性名是不可以变化的,也就是说 GroupName 应该是固定的,因为你说了你要转化成 javabean 嘛,javabean 字段是固定的,那 groupName 肯定也要是固定的呀,不过我看你的需求(json 的属性名是不固定的)那你不应该转化成 javabean,而是应该转化成 Map,这样你通过 Map.keySet 去遍历所有属性了
    starry97
        8
    starry97  
    OP
       2020-07-16 23:24:56 +08:00
    感谢大家,已经解决了,还是我太菜了。
    解决方法:
    gson.fromJson(jsonStr, new TypeToken<HashMap<String, HashMap<String, JsonBean>>>(){}.getType());
    lxk11153
        9
    lxk11153  
       2020-07-16 23:25:43 +08:00
    1. com.fasterxml.jackson.databind.ObjectMapper#readValue(String, TypeReference)
    ---- new TypeReference<Map
    2. com.alibaba.fastjson.JSON#parseObject(String)
    GM
        10
    GM  
       2020-07-17 00:17:18 +08:00
    @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();
    hand515
        11
    hand515  
       2020-07-17 08:24:14 +08:00   ❤️ 1
    Map<String,Map<String,User>>

    有时候挺反感这种 Json 定义的,遇到了还得多写不少行代码,用数组不好吗
    starry97
        12
    starry97  
    OP
       2020-07-17 10:04:54 +08:00
    @GM tree.get("GroupName1").get("name1"); 这个 GroupName1 和 name1 是一直变的,可以用遍历的方法将 tree 一层一层遍历出来吗?
    starry97
        13
    starry97  
    OP
       2020-07-17 10:06:01 +08:00
    @hand515 GroupName1 里的 name 是一直变的,不好用数组表示吧 😂😂😂
    GM
        14
    GM  
       2020-07-17 11:16:10 +08:00
    @starry97 可以
    EminemW
        15
    EminemW  
       2020-07-17 15:32:50 +08:00
    你的 json 结构应该弄成这样。我觉得你那样不太合适
    {
    "Group":[
    {
    "GroupName":"name1",
    "member":[
    {
    "name":"li",
    "age":22
    },
    {
    "name":"zhang",
    "age":23
    }
    ]
    },
    {
    "GroupName":"name2",
    "member":[
    {
    "name":"li",
    "age":22
    },
    {
    "name":"zhang",
    "age":23
    },
    {
    "name":"wang",
    "age":22
    }
    ]
    }
    ]
    }
    cco
        16
    cco  
       2020-07-17 17:07:49 +08:00
    JSON 设计也是一门艺术- -! 你这。。。。
    NotFoundEgg
        17
    NotFoundEgg  
       2020-07-18 19:33:19 +08:00
    不建议把业务参数当成 json 的 key
    偷懒一时爽 加参火葬场
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5817 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 31ms · UTC 02:30 · PVG 10:30 · LAX 18:30 · JFK 21:30
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.