【问题标题】:How to handle empty or null values when converting json string to pojo using jackson wtih javajava - 使用jackson和java将json字符串转换为pojo时如何处理空值或空值
【发布时间】:2016-10-23 02:47:58
【问题描述】:

以下是我使用杰克逊转换为 pojo 的 json 响应 -

{
    paymentType": [
        {
            "Monthly": ["Monthly", "Monthly"],
            "Prepaid": ["Prepaid", "Prepaid"]
        },
        ""
    ]
}

代码:

String rspString = "{\"paymentType\": [{\"Monthly\": [\"Monthly\",\"Monthly\"],\"Prepaid\": [\"Prepaid\",\"Prepaid\"]},\"\"]}";

JsonUtil jsonUtil = new JsonUtil();
PaymentTypeResponse PaymentTypeRsp = new PaymentTypeResponse();
PaymentTypeRsp = (PaymentTypeResponse) jsonUtil.Json2Object(rspString, PaymentTypeRsp);
System.out.println(PaymentTypeRsp.getPaymentType().size());

我收到以下异常:

线程“main”中的异常 com.fasterxml.jackson.databind.JsonMappingException:不能 实例化类型的值 [简单类型,类 com.test.sample.PaymentTypeRespons] 来自字符串值 ('');不 单字符串构造函数/工厂方法

响应中有一个空白值,转换为pojo时如何处理这些值?

同理如果为null,这种情况如何处理?

任何指针将不胜感激。

提前致谢。

这是课程:

public class PaymentType 
{
    @JsonProperty("Monthly")
    public List<String> monthly;
    @JsonProperty("Prepaid")
    public List<String> prepaid;

     //getter and setters
}

public PaymentTypeResponse 
{
    @JsonProperty("paymentType")
    public List<PaymentType> paymentType;

    //setters and Getters
}

【问题讨论】:

  • 请添加 PaymentTypeResponse 类

标签: java json jackson


【解决方案1】:

如果您只收到null 或空字符串,而不是正确表示您的PaymentType 类的JSON 对象,那么在ObjectMapper 中设置以下反序列化功能就足够了:

mapper.enable(DeserializationFeature.ACCEPT_EMPTY_STRING_AS_NULL_OBJECT);

现在,空字符串将被强制转换为null,你就不会再有这个问题了。


一种更通用的方法(虽然处理起来更复杂)是向您的 PaymentType 类添加一个接受 String 参数的构造函数:

public PaymentType() {
}

public PaymentType(String json) {
    // parse the json string here and initialize members
}

在接收String 参数的构造函数中,您可以根据需要解析字符串。

请注意,您还需要添加无参数构造函数,以便 Jackson 可以从有效的 JSON 反序列化。

【讨论】:

    【解决方案2】:

    根据您的 pojo 类,您的 json 不正确。在您的 json 中,“paymentType”数组中的第三个元素是一个空字符串,它应该是一个数组或只是 null。

    从此更改您的 json -

    {
        "paymentType": [{
            "Monthly": ["Monthly", "Monthly"],
            "Prepaid": ["Prepaid", "Prepaid"]
        }, ""]
    }
    

    到这里——

    {
        "paymentType": [{
            "Monthly": ["Monthly", "Monthly"],
            "Prepaid": ["Prepaid", "Prepaid"]
        }]
    }
    

    Json 字符串 -

     String rspString = "{\"paymentType\": [{\"Monthly\": [\"Monthly\",\"Monthly\"],\"Prepaid\": [\"Prepaid\",\"Prepaid\"]},null]}";
    

    或者这个 -

    {
        "paymentType": [{
            "Monthly": ["Monthly", "Monthly"],
            "Prepaid": ["Prepaid", "Prepaid"]
        }, null]
    }
    

    Json 字符串 -

    String rspString = "{\"paymentType\": [{\"Monthly\": [\"Monthly\",\"Monthly\"],\"Prepaid\": [\"Prepaid\",\"Prepaid\"]}]}";
    

    【讨论】:

    • 您好,感谢您的回复,我无法更改它开发的 json,因为它保留了空值。基于那个json我写了这个类。我无法写第三个,因为它包含空值,
    • 为此,您必须编写自己的自定义反序列化器,这可能会有所帮助 - stackoverflow.com/questions/12933394/…
    猜你喜欢
    • 1970-01-01
    • 2020-04-27
    • 1970-01-01
    • 2012-11-15
    • 2012-08-21
    • 1970-01-01
    • 2021-10-27
    • 2018-12-26
    • 2015-07-17
    相关资源
    最近更新 更多