我有一个有时看起来像这样的对象:
{
"foo" : "bar",
"fuzz" : "bla"
}
Run Code Online (Sandbox Code Playgroud)
有时看起来像这样:
{
"foo" : { "value" : "bar", "baz": "asdf" },
"fuzz" : { "thing" : "bla", "blip" : "asdf" }
}
Run Code Online (Sandbox Code Playgroud)
这些类看起来像:
public class Foo {
String value;
String baz;
}
public class Fuzz {
String thing;
String blip;
}
Run Code Online (Sandbox Code Playgroud)
第一种情况是第二种情况的简写。我想总是反序列化到第二种情况。
此外 - 这是我们代码中非常常见的模式,因此我希望能够以通用方式进行序列化,因为还有其他与Foo上述类似的类具有使用 String 作为语法糖的相同模式更复杂的对象。
我想使用它的代码看起来像这样
public class Thing {
@JsonProperty("fuzz")
Fuzz fuzz;
@JsonProperty("foo")
Foo foo;
}
Run Code Online (Sandbox Code Playgroud)
我如何编写一个通常处理这两种情况的自定义解串器(或其他一些模块)?
我需要反序列化一个又长又复杂的json,为此我编写了一组java类来映射数据,并且我必须为许多不同类型的字段(包括String、Boolean、BigDecimal等)编写自定义反序列化器。
我知道我可以使用相应的自定义反序列化器注释 java 类中的所有字段(如下所示),但随后我需要注释所有类中的几乎所有字段。
@JsonDeserialize(using = CustomBooleanJsonDeserializer.class)
private boolean active;
Run Code Online (Sandbox Code Playgroud)
我还知道我可以在 Spring 默认情况下注册一个模块ObjectMapper(如此处),但我只想对这些特定的类使用这些自定义反序列化器。
@Bean
public Module customDeserializersModule() {
SimpleModule module = new SimpleModule();
module.addDeserializer(Boolean.class, new CustomBooleanJsonDeserializer());
// add other custom deserializers
return module;
}
Run Code Online (Sandbox Code Playgroud)
ObjectMapper我什至知道我可以在 中使用自定义RestController,但我不想放弃通过自动数据绑定的便利@RequestBody,因为我必须防止其他人在没有必要的自定义反序列化器的情况下使用它。
@RequestMapping(method = RequestMethod.POST, value = "/data")
public ResponseEntity<ServerInfo> register(@RequestBody DataMapper data) {
// DataMapper is the target POJO class of the json's deserialization
}
Run Code Online (Sandbox Code Playgroud)
简而言之,我正在班级层面寻找类似的东西:
@JsonDeserialize(using = CustomStringJsonDeserializer.class, forType = String.class)
@JsonDeserialize(using = …Run Code Online (Sandbox Code Playgroud) 我无法找出使用杰克逊实现自定义序列化/反序列化的正确方法。我有许多带有原始字段的类(~50),这些字段应该被序列化/反序列化,而不是作为原始字段。喜欢:
class User {
int height // this field should be serialized as "height": "10 m"
}
class Food {
int temperature // this field should be serialized as "temperature": "50 C"
}
class House {
int width // this field should be serialized as "width": "10 m"
}
Run Code Online (Sandbox Code Playgroud)
所有序列化和反序列化都非常相似,我只需要在整数后面添加一个后缀(C、页、米等..)
执行此操作的一种简单方法是将一对@JsonSerialize/@JsonDeserialize注释添加到每个此类字段并实现它们。但我最终会得到 100 个非常相似的序列化器/反序列化器。
我考虑过向每个字段(例如@Units("Degree")或@Units("Meters"))添加自定义注释到此类整数字段,并实现 ,SerializationProvider它将基于注释值以通用方式创建序列化器。但我没有找到提供有关属性注释信息的地方。