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

GSON:我如何解析可以是列表或字符串的多态值?

娄德运
2023-03-14
{
  "cust_id": "87655",
  ...
},
   {
      "cust_id": [
        "12345",
        "45678"
      ],
      ...
    },

Customer类如下所示:

public class Customer {

    @SerializedName("cust_id")
    @Expose
    private String custId;
    public String getCustId() {
        return custId;
    }

    public void setCustId(String custId) {
        this.custId = custId;
    }
}

我使用GSON解析JSON:

Gson gson = new Gson()
Customers customers1 = gson.fromJson(json, Customers.class)

它在com.google.gson.jsonSyntaxException:java.lang.IllegalStateException中失败:当它试图解析数组时,需要一个字符串,但却是begin_array

失败的原因很清楚。

我的问题是:如果我不能更改json文件结构,那么处理这两种情况(当id是字符串时,当id是字符串数组时)的最佳方法是什么?

共有1个答案

金珂
2023-03-14

如果要处理这两种情况,可以使用自定义反序列化器。当然,您必须将“cust_id”变量更改为列表或数组

主要:

String json1 = "{\"cust_id\": \"87655\"}";
String json2 = "{\"cust_id\": [\"12345\", \"45678\"]}";

GsonBuilder gsonBuilder = new GsonBuilder();
gsonBuilder.registerTypeAdapter(Customer.class, new CustomerDeserializer());
Gson gson = gsonBuilder.create();

Customer customer1 = gson.fromJson(json1, Customer.class);
System.out.println(customer1);

Customer customer2 = gson.fromJson(json2, Customer.class);
System.out.println(customer2);

客户

public class Customer {

    @SerializedName("cust_id")
    private List<String> custId;

    public List<String> getCustId() {
        return custId;
    }

    public void setCustId(List<String> custId) {
        this.custId = custId;
    }
}
public class CustomerDeserializer implements JsonDeserializer<Customer> {

@Override
public Customer deserialize(JsonElement jsonElement, Type typeOf, JsonDeserializationContext context) throws JsonParseException {
    Customer result = null;
    Gson gson = new Gson();

    try {
        // try to deserialize by assuming JSON has a list
        result = gson.fromJson(jsonElement, Customer.class);
    } catch (JsonSyntaxException jse) {
        // error here means JSON has a single string instead of a list

        try {
            // get the single ID
            String custId = jsonElement.getAsJsonObject().get("cust_id").getAsString();

            result = new Customer();
            result.setCustId(Arrays.asList(new String[] {custId}));
        } catch (Exception e) {
            // more error handling here
            e.printStackTrace();
        }
    }

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

  • 无法弄清楚如何将以下带有GSON的JSON字符串解析为任何适当的对象以检索其数据。字符串是: 我发现方括号表示它是一个ArrayList,但里面还有另一个对象。 如果我试着在ArrayList上搜索: 然后它抱怨: 如果我尝试相反的方法: 然后它也在抱怨: 不理解该格式:-/ 感谢您的任何建议!

  • 我有一个json文件。 我需要将它转换为String的ArrayList。如何使用Jackson库? UPD2:

  • 问题内容: 我在解组一些我无法控制的Json时遇到麻烦。在一个字段中,有99%的时间是字符串,但偶尔是数组。 杰森如下: 错误:json:无法将数组解组为字符串类型的Go结构字段MyListItem.display_name 问题答案: 使用json.RawMessage捕获变化的字段。 使用json“-”名称对解码器隐藏字段。顶级JSON解码后,应用程序将填充此字段。 解组顶级JSON: 根据原

  • 问题内容: 我正试图解组该文件: 进入这个结构: 使用以下说明: 问题是在“ json-schema@0.2.3”中,我们有一个许可证数组而不是一个字符串,由于这个原因,我显然得到了 有没有一种方法可以自动处理可以是数组或字符串的字段? 谢谢 问题答案: 不幸的是,软件包没有提供真正的自动解决方案。 但是您可以将依赖项解组为a 而不是。只是一个,因此您可以根据第一个字节确定消息的类型。 例: 另一

  • 我当前的项目使用Kotlin序列化来使用一系列远程RESTFul API。 API响应是Json,我无法修改它们。 其中一个API将“Person”作为字符串或字符串数组返回。 我如何让Kotlin序列化自动消耗任何一个值? 我使用这个版本的静态编程语言序列化