kil*_*971 6 java json map jackson deserialization
使用Jackson json库,可以通过使用来反序列化对象@JsonCreator,并给出表示输入json的"顶级"映射,如下所示:
class MyClass {
final int field;
@JsonCreator
public MyClass(Map<String, Object> map) {
this.field = (int) map.get("theInt");
}
}
Run Code Online (Sandbox Code Playgroud)
甚至是静态工厂方法:
class MyClass {
final int field;
public MyClass(int theInt) {
this.field = theInt;
}
@JsonCreator
static MyClass create(Map<String, Object> map) {
return new MyClass((int) map.get("theInt"));
}
}
Run Code Online (Sandbox Code Playgroud)
前面的示例可以处理以下类型的json输入:
{
"key1":"value1",
"key2":"value2",
"key3":"value3"
}
Run Code Online (Sandbox Code Playgroud)
这在我的情况下特别有用,因为我想反序列化一个我不知道的json结构.通过访问我称之为"顶级地图"的内容,可以简化操作.
我想以这种方式反序列化我的对象,因为它也允许创建不可变对象,而不是使用@JsonAnySetter不允许这样的对象,@JsonProperty我不能使用它,因为我不提前知道属性名称,如前所述.
然后再往前走,我想在我的工厂方法中注入一些配置,而杰克逊允许通过使用@JacksonInject和调用来withInjectableValues(InjectableValues)实现ObjectMapper.
这最终是我想要使用的代码类型:
class MyClass {
final MyField[] myFields;
public MyClass(MyField... myFields) {
this.myFields = myFields;
}
@JsonCreator
static MyClass create(@JacksonInject("conf") Conf conf, Map<String, Object> map) {
MyFields[] myFields;
// initialize myFields (or any other object) based on the content of map
// and also make use of the inject conf
return new MyClass(myFields);
}
}
Run Code Online (Sandbox Code Playgroud)
不幸的是,杰克逊抛出以下类型的例外:
JsonMappingException: Argument #1 of constructor [constructor for MyClass, annotations: {JsonCreator=@JsonCreator()}] has no property name annotation; must have name when multiple-paramater constructor annotated as Creator
JsonMappingException: Argument #1 of factory method [method create, annotations: {JsonCreator=@JsonCreator()}] has no property name annotation; must have when multiple-paramater static method annotated as Creator
有谁知道我怎么能解决这个问题?
总结要求,我需要:
@JsonAnySetter)@JsonCreator装饰的构造函数或工厂方法注入一些conf我无法更改json输入格式,如下所示:
{
"key1":"value1",
"key2":"value2",
"key3":"value3"
}
Run Code Online (Sandbox Code Playgroud)
[编辑]
这是一个众所周知的问题:http://jira.codehaus.org/browse/JACKSON-711(尚未修复)
是的,您希望同时使用“委托”创建者(单个参数,首先绑定 JSON 输入)——与传递一组命名参数的“基于属性”创建者不同——以及可注入值。理想情况下这应该可行,但我认为目前可能行不通。我认为为此输入了一个 Jira,因此您可以查看它(http://jira.codehaus.org/browse/JACKSON)。
只是为了确定:您使用的是 1.9.2 版本吗?自 1.9.0 以来,已对此进行了一些修复;这至少会给出更好的错误消息。
| 归档时间: |
|
| 查看次数: |
7462 次 |
| 最近记录: |