java – 使用GSON解析JSON,对象有时包含列表有时包含对象
发布时间:2020-12-14 05:17:19 所属栏目:Java 来源:网络整理
导读:我正在使用有时包含子对象列表的API: { 'obj' : { children: [ {id: "1"},{id: "2"} ] } } 我可以解析这个没问题.但如果只有一个孩子,它不会将其作为列表返回: { 'obj' : { children: {id: "1"} } } 我的解析器,期望一个列表然后中断.有谁有一个建议如何处
|
我正在使用有时包含子对象列表的API:
{ 'obj' : { children: [ {id: "1"},{id: "2"} ] } }
我可以解析这个没问题.但如果只有一个孩子,它不会将其作为列表返回: { 'obj' : { children: {id: "1"} } }
我的解析器,期望一个列表然后中断.有谁有一个建议如何处理这个? 解决方法
使用Gson,我知道如何处理这种情况的唯一方法是使用自定义的Deserializer.例如:
// outputs:
// [Container: obj=[ChildContainer: children=[[Child: id=1],[Child: id=2]]]]
// [Container: obj=[ChildContainer: children=[[Child: id=1]]]]
public class Foo
{
static String json1 = "{"obj":{"children":[{"id":"1"},{"id":"2"}]}}";
static String json2 = "{"obj":{"children":{"id":"1"}}}";
public static void main(String[] args)
{
GsonBuilder gsonBuilder = new GsonBuilder();
gsonBuilder.setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES);
gsonBuilder.registerTypeAdapter(Child[].class,new ChildrenDeserializer());
Gson gson = gsonBuilder.create();
Container container1 = gson.fromJson(json1,Container.class);
System.out.println(container1);
Container container2 = gson.fromJson(json2,Container.class);
System.out.println(container2);
}
}
class Container
{
ChildContainer obj;
@Override
public String toString()
{
return String.format("[Container: obj=%1$s]",obj);
}
}
class ChildContainer
{
Child[] children;
@Override
public String toString()
{
return String.format("[ChildContainer: children=%1$s]",Arrays.toString(children));
}
}
class Child
{
String id;
@Override
public String toString()
{
return String.format("[Child: id=%1$s]",id);
}
}
class ChildrenDeserializer implements JsonDeserializer<Child[]>
{
@Override
public Child[] deserialize(JsonElement json,Type typeOfT,JsonDeserializationContext context)
throws JsonParseException
{
if (json instanceof JsonArray)
{
return new Gson().fromJson(json,Child[].class);
}
Child child = context.deserialize(json,Child.class);
return new Child[] { child };
}
}
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容
- SpringBoot实战(七)之与Redis进行消息传递
- Java可恢复哈希计算
- rest – 可能的多线程算法列出大型S3存储桶中的所有密钥?
- 使用不同版本的JDK编译Java,同样的目标和源版本保证执行相同
- Uncaught TypeError: Illegal invocation问题解决方法
- How to Tune Java Garbage Collection--reference
- java – DateFormat将新的Date(0)打印为epoch 1小时
- java – 验证对静态方法的调用
- Qemu 虚拟机网卡透传(PCI Pass Through)
- java.net.ConnectException: Your endpoint configuration
