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

2020-07-16 22:57:43 +08:00
 starry97

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

有时候挺反感这种 Json 定义的,遇到了还得多写不少行代码,用数组不好吗
starry97
2020-07-17 10:04:54 +08:00
@GM tree.get("GroupName1").get("name1"); 这个 GroupName1 和 name1 是一直变的,可以用遍历的方法将 tree 一层一层遍历出来吗?
starry97
2020-07-17 10:06:01 +08:00
@hand515 GroupName1 里的 name 是一直变的,不好用数组表示吧 😂😂😂
GM
2020-07-17 11:16:10 +08:00
@starry97 可以
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
2020-07-17 17:07:49 +08:00
JSON 设计也是一门艺术- -! 你这。。。。
NotFoundEgg
2020-07-18 19:33:19 +08:00
不建议把业务参数当成 json 的 key
偷懒一时爽 加参火葬场

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

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

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

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

© 2021 V2EX