GSON,如何反​​序列化数组或空字符串 [英] Gson, how to deserialize array or empty string

查看:262
本文介绍了GSON,如何反​​序列化数组或空字符串的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想这个JSON反序列化对象的数组:

  [{
    名:第1项
    标签:标签1]
},
{
    名:项目2
    标签:TAG1,标签2]
},
{
    名:项目3
    标签:[]
},
{
    名:项目4,
    标签:
}]

我的Java类看起来是这样的:

 公共类为MyObject
{
    @暴露
    私人字符串名称;    @暴露
    私人列表<串GT;标签=新的ArrayList<串GT;();
}

问题是JSON的标签属性,它可以只是空字符串或数组。眼下GSON给我的错误: com.google.gson.JsonSyntaxException:java.lang.IllegalStateException:预期BEGIN_ARRAY但STRING

我应该如何反序列化此JSON?

我没有任何控制这JSON,它来自3 pary API。


解决方案

  

我没有任何控制这JSON,它来自3 pary API。


如果你没有在数据的控制,你最好的办法是在我看来,创建一个自定义解串器:

 类MyObjectDeserializer实现JsonDeserializer<&MyObject的GT; {
    @覆盖
    公众为MyObject反序列化(JsonElement JSON,类型typeOfT,JsonDeserializationContext上下文)抛出JsonParseException {
        JSONObject的jObj = json.getAsJsonObject();
        JsonElement jElement = jObj.get(标签);
        清单<串GT;标记= Collections.emptyList();
        如果(jElement.isJsonArray()){
            标签= context.deserialize(jElement.getAsJsonArray(),新TypeToken<名单,LT;弦乐>方式>(){}的getType());
        }
        //假设有一个合适的构造函数
        返回新MyObject来(jObj.getAsJsonPrimitive(name)的符getAsString(),标签);
    }
}

它做什么它,它会检查是否标签 JsonArray 与否。如果是这样的话,它反序列化像往常一样,否则你不要去碰它,只是用一个空列表创建的对象。

一旦你已经写了,你需要的JSON解析器内注册它:

  GSON GSON =新GsonBuilder()registerTypeAdapter(MyObject.class,新MyObjectDeserializer())创建()。
//这里JSON是包含您输入的字符串
清单<&MyObject的GT; myObjects = gson.fromJson(JSON,新TypeToken<名单,LT;为MyObject>>(){}的getType());

运行它,我得到作为输出:

  MyObject的{名='项目1',标签= [标签1]}
为MyObject {名称=第2项,标签= [TAG1,TAG2]}
为MyObject {名='项目3',标签= []}
为MyObject {名='项目4',标签= []}

I trying to deserialize this json to array of objects:

[{
    "name": "item 1",
    "tags": ["tag1"]
},
{
    "name": "item 2",
    "tags": ["tag1","tag2"]
},
{
    "name": "item 3",
    "tags": []
},
{
    "name": "item 4",
    "tags": ""
}]

My java class looks like this:

public class MyObject
{
    @Expose
    private String name;

    @Expose
    private List<String> tags = new ArrayList<String>();
}

The problem is json's tags property which can be just empty string or array. Right now gson gives me error: com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected BEGIN_ARRAY but was STRING

How should I deserialize this json?

I do not have any control to this json, it comes from 3rd pary api.

解决方案

I do not have any control to this json, it comes from 3rd pary api.

If you don't have the control over the data, your best solution is to create a custom deserializer in my opinion:

class MyObjectDeserializer implements JsonDeserializer<MyObject> {
    @Override
    public MyObject deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
        JsonObject jObj = json.getAsJsonObject();
        JsonElement jElement = jObj.get("tags");
        List<String> tags = Collections.emptyList();
        if(jElement.isJsonArray()) {
            tags = context.deserialize(jElement.getAsJsonArray(), new TypeToken<List<String>>(){}.getType());
        }
        //assuming there is an appropriate constructor
        return new MyObject(jObj.getAsJsonPrimitive("name").getAsString(), tags);
    }
}

What it does it that it checks whether "tags" is a JsonArray or not. If it's the case, it deserializes it as usual, otherwise you don't touch it and just create your object with an empty list.

Once you've written that, you need to register it within the JSON parser:

Gson gson = new GsonBuilder().registerTypeAdapter(MyObject.class, new MyObjectDeserializer()).create();
//here json is a String that contains your input
List<MyObject> myObjects = gson.fromJson(json, new TypeToken<List<MyObject>>(){}.getType());

Running it, I get as output:

MyObject{name='item 1', tags=[tag1]}
MyObject{name='item 2', tags=[tag1, tag2]}
MyObject{name='item 3', tags=[]}
MyObject{name='item 4', tags=[]}

这篇关于GSON,如何反​​序列化数组或空字符串的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆