当前位置: 首页 > 知识库问答 >
问题:

Gson,如何反序列化数组或空字符串

乔凯康
2023-03-14

我试图反序列化这个json对象数组:

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

我的java类看起来像这样:

public class MyObject
{
    @Expose
    private String name;

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

问题在于json的tags属性,它可以是空字符串或数组。现在gson给了我一个错误:com.google.格森。JsonSyntaxException:java。lang.IllegalStateException:应为BEGIN_数组,但为字符串

我应该如何反序列化这个json?

我对这个json没有任何控制,它来自第三方api。

共有3个答案

百里海超
2023-03-14

使用GSON的fromJson()方法对JSON进行反序列化。

通过以下示例,您可以更好地理解这一点:

import java.util.ArrayList;
import com.google.gson.Gson;
import com.google.gson.JsonArray;
import com.google.gson.JsonElement;
import com.google.gson.JsonParser;

public class JsonToJava {

/**
 * @param args
 */
public static void main(String[] args) {
    String json = "[{\"firstName\":\"John\", \"lastName\":\"Doe\", \"id\":[\"10\",\"20\",\"30\"]},"
            + "{\"firstName\":\"Anna\", \"lastName\":\"Smith\", \"id\":[\"40\",\"50\",\"60\"]},"
            + "{\"firstName\":\"Peter\", \"lastName\":\"Jones\", \"id\":[\"70\",\"80\",\"90\"]},"
            + "{\"firstName\":\"Ankur\", \"lastName\":\"Mahajan\", \"id\":[\"100\",\"200\",\"300\"]},"
            + "{\"firstName\":\"Abhishek\", \"lastName\":\"Mahajan\", \"id\":[\"400\",\"500\",\"600\"]}]";

    jsonToJava(json);
}

private static void jsonToJava(String json) {
    Gson gson = new Gson();
    JsonParser parser = new JsonParser();
    JsonArray jArray = parser.parse(json).getAsJsonArray();

    ArrayList<POJO> lcs = new ArrayList<POJO>();

    for (JsonElement obj : jArray) {
        POJO cse = gson.fromJson(obj, POJO.class);
        lcs.add(cse);
    }
    for (POJO pojo : lcs) {
        System.out.println(pojo.getFirstName() + ", " + pojo.getLastName()
                + ", " + pojo.getId());
    }
}

}

POJO类:

public class POJO {

  private String        firstName;
  private String        lastName;
  private String[]  id;
  //Getters and Setters.

我希望这能解决你的问题。

孟意致
2023-03-14

在将json转换为对象之前,将字符串"tags": ""替换为"tags": []

沈栋
2023-03-14

我对这个json没有任何控制,它来自第三方api。

如果您无法控制数据,我认为最好的解决方案是创建自定义反序列化程序:

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);
    }
}

它所做的就是检查“tags”是否是JsonArray。如果是这样的话,它会像往常一样反序列化它,否则你不去碰它,只会创建一个空列表的对象。

编写完成后,需要在JSON解析器中注册:

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());

运行它,我得到输出:

MyObject{name='item 1', tags=[tag1]}
MyObject{name='item 2', tags=[tag1, tag2]}
MyObject{name='item 3', tags=[]}
MyObject{name='item 4', tags=[]}
 类似资料:
  • 问题内容: 我有以下json 问题在于,价值价值也是 要么 并将其存储在这些 我相信我通过这样做解决了不是数组而是单个对象的问题 现在,当整个事情以字符串形式返回时,我仍然处于困境.... 问题答案: 我们的想法是试图让(从外地 )为第一,如果抛出异常,这将意味着,没有 进入 ,这将意味着是。用同样的方法,我们可以计算出状况时场。 在我的示例代码中,其他操作也可能引发jsonExceptions,

  • 我有一个Android应用程序,与Spring开发的RESTAPI联系。应用程序很好地序列化了一个对象,但是Spring应用程序在每个字段不为null时将其解析为null。有什么不对劲?我该怎么办? 这是REST API方法签名:cambioPassword(@quiestHeader(授权)字符串头,PasswordChange userData) 注意:应用程序和API都使用Gson(我没有在

  • 问题内容: 我在反序列化以下json数组时遇到麻烦(对不起,大小): 如果将其粘贴到json-viewer中,则会得到以下结构: 现在,包含具有坐标的数组的数组具有可变大小。所以我想在Java中,整个对象应该是一个数组,其中包含数组的集合,每个数组都包含一个。就像是 但是gson不接受这一点。我收到以下错误消息: 这似乎很奇怪,因为对我来说好像不像一个数组。但这可能使我感到困惑,或多或少地迷路了…

  • 我像这样接收JSON 当然,我实现了包含所有字段和类的类Track、Album和Playlist 顺便说一句,我不能改变JSON。所以我需要一个代码来解析它。

  • 有没有一种通用的方法告诉Gson不要写空字符串? 我非常不喜欢实现一个TypeAdapter,它可以像这里的答案所暗示的那样处理每个字段。

  • 问题内容: 我有以下类,它是由Jackson映射的(简化版): 在某些情况下,服务器会返回,然后我想将name设置为空的Java String。 是否有任何Jackson注释,或者如果属性为,我应该只检查getter中的null并返回空字符串? 问题答案: 您可以在默认构造函数中或声明时进行设置: 要么