gpt4 book ai didi

json - 如何使用 Jackson JSON 处理器处理无效值?

转载 作者:行者123 更新时间:2023-12-04 06:20:21 25 4
gpt4 key购买 nike

我使用 jackson 来处理 json。

现在,我面临一个问题。

我的 POJO:

class Person{
public String name;
public int age;
}

JSON是
{"name":"Jackson","age":""}.

如果我这样写代码:
Person person = mapper.readValue("{\"name\":\"Jackson\",\"age\":\"\"}", Person.class);

抛出异常:

Can not construct instance of int from String value "": not a valid int value.



如果 JSON 是 "{\"name\":\"Jackson\",\"age\":null}" , 没关系。

但是现在,我不想修改 JSON。我该怎么办?

最佳答案

我建议在 http://jira.codehaus.org/browse/JACKSON 记录问题,要求将其视为错误,或者添加允许正确处理的功能。 (也许 DeserializationConfig.Feature.ACCEPT_EMPTY_STRING_AS_NULL_OBJECT 还允许将空 JSON 字符串反序列化为默认原始值是合理的,因为这就是 JSON 空值在绑定(bind)到 Java 原始值时的处理方式。)( 更新: 我为此记录了 issue 616。投票给它如果你想实现它。)

在 Jackson 如此增强之前,需要自定义反序列化处理才能将 JSON 空字符串转换为默认的原始值(或任何需要的非字符串值)。下面是这样一个例子,幸运的是,它很简单,因为现有的反序列化为 int 的代码已经处理了一个空字符串,将其变为 0。

import java.io.IOException;

import org.codehaus.jackson.JsonParser;
import org.codehaus.jackson.JsonProcessingException;
import org.codehaus.jackson.Version;
import org.codehaus.jackson.map.DeserializationContext;
import org.codehaus.jackson.map.ObjectMapper;
import org.codehaus.jackson.map.deser.StdDeserializer;
import org.codehaus.jackson.map.module.SimpleModule;

public class Foo
{
public static void main(String[] args) throws Exception
{
// {"name":"Jackson","age":""}
String json = "{\"name\":\"Jackson\",\"age\":\"\"}";

SimpleModule module = new SimpleModule("EmptyJsonStringAsInt", Version.unknownVersion());
module.addDeserializer(int.class, new EmptyJsonStringAsIntDeserializer(int.class));

ObjectMapper mapper = new ObjectMapper().withModule(module);
Person p = mapper.readValue(json, Person.class);
System.out.println(mapper.writeValueAsString(p));
// {"name":"Jackson","age":0}
}
}

class Person
{
public String name;
public int age;
}

class EmptyJsonStringAsIntDeserializer extends StdDeserializer<Integer>
{
protected EmptyJsonStringAsIntDeserializer(Class<?> vc)
{
super(vc);
}

@Override
public Integer deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException, JsonProcessingException
{
return super._parseIntPrimitive(jp, ctxt);
}
}

(另外,请注意,如果目标类型是 Integer 而不是 int,则该字段将填充一个空值(这不是我们想要的)。为此,我记录了 issue 617 ,以请求反序列化配置以自动设置原语JSON null 值的默认值,当绑定(bind)到原始包装类型字段时。换句话说,当从 JSON null 值反序列化为 Integer 字段时,目标字段将设置为 Integer.valueOf(0) 而不是 null 。)

关于json - 如何使用 Jackson JSON 处理器处理无效值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6661717/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com