gpt4 book ai didi

java - 将 json 转换为具有混合类型的数组的 java 对象

转载 作者:行者123 更新时间:2023-11-30 11:00:41 25 4
gpt4 key购买 nike

我的 json 字符串如下所示:

{
"text": ["foo",1,"bar","2",3],
"text1": "value1",
"ComplexObject": {
.....
}
}

我有一个这样定义的 pojo:

class MyPojo {
List<String> text;
String text1;
ComplexObject complexObject;
}

我使用 google gson 并能够正确填充我的 java 对象。这里的问题是字段文本是混合类型(字符串和整数)的数组。所以那里的所有条目都被转换成字符串,我无法弄清楚数组中的哪些条目是字符串还是整数。我不能使用 parseInt,因为原始数组中的条目可能有“2”和 3。

在转换为 java 对象后,有没有办法让我在数组中获取字段的正确实例类型。

解决方案

所以我使用 JsonDeserializer 的循环方式使用 gson 实现了解决方案。然后我尝试使用 jackson 。猜猜 jackson 支持通过保留数据类型对混合数组类型进行序列化/反序列化。

ObjectMapper mapper = new ObjectMapper();
MyPojo gmEntry = mapper.readValue(json, new TypeReference<MyPojo >(){});

我基本上可以获取 List 并执行 instanceof 来检查数据类型。

你 gson 可耻!

最佳答案

通过自定义类并添加类型适配器,您可以操作字符串(json.toString() 返回带有 '"' 引号,因此您可以查看它是否是字符串。

输出:(类看起来是正确的)

类测试.Main$StringPojo pojo{object=foo}

类测试.Main$IntPojo pojo{object=1}

类测试.Main$StringPojo pojo{object=bar}

类测试.Main$StringPojo pojo{object=2}

类测试.Main$IntPojo pojo{object=3}

public static void main(final String[] args){


String str = "{\n" +
" \"text\": [\"foo\",1,\"bar\",\"2\",3],\n" +
" \"text1\": \"value1\" }";

GsonBuilder builder = new GsonBuilder();
builder.registerTypeAdapter(pojo.class, new JsonDeserializer<pojo>() {
@Override
public pojo deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
try {
return new IntPojo(Integer.parseInt(json.toString()));
} catch (Exception e) {
return new StringPojo(json.getAsString());
}
}
});
MyPojo myPojo = builder.create().fromJson(str, MyPojo.class);
for (pojo pojo : myPojo.text) {
System.out.println(pojo.getClass() + " " + pojo.object);
}
}

public static abstract class pojo{
protected Object object;

public pojo() {
}

@Override
public String toString() {
return "pojo{" +
"object=" + object +
'}';
}
}

public static class StringPojo extends pojo{
public StringPojo(String str) {
object = str;
}
}

public static class IntPojo extends pojo{

public IntPojo(int intt) {
this.object = intt;
}
}
public static class MyPojo {
List<pojo> text;
String text1;
}

关于java - 将 json 转换为具有混合类型的数组的 java 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31421173/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com