- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我有两个这样的类:
public class A {
String aProp = "aProp";
public String getAProp() {
return aProp;
}
}
public class B {
String bProp = "bProp";
A a = new A();
@JsonProperty("bProp")
public String getBProp() {
return bProp;
}
@JsonSerialize(using = CustomSerializer.class)
public A getA() {
return a;
}
}
我希望得到这样的 JSON:
{
"bProp": "bProp", // just serizlised bProp
"sProp1": "sProp1_aProp", // computed using aProp
"sProp2": "sProp2_aProp" // computed another way
}
所以我像这样编写了自定义 JsonSerializer
:
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.SerializerProvider;
public class CustomSerializer extends JsonSerializer<A> {
@Override
public void serialize(A a, JsonGenerator json, SerializerProvider provider) throws IOException {
json.writeStringField("sProp1", "sProp1_" + a.getAProp());
json.writeStringField("sProp2", "sProp2_" + a.getAProp());
}
}
但我一直收到错误:
com.fasterxml.jackson.core.JsonGenerationException: Can not write a field name, expecting a value
除非我将 json.writeStartObject();
和 json.writeEndObject();
放在序列化方法中(因此它会产生错误的 JSON)。
所以我正在寻找像 @JsonUnwrapped
这样的解决方案来与自定义 JsonSerializer
一起使用。
最佳答案
我了解您的问题,您需要的是 UnwrappingBeanSerializer
。你可以看到另一个相关的 SO 帖子: Different JSON output when using custom json serializer in Spring Data Rest
问题是你不能在一个字段中同时使用注释 @JacksonUnwrapped
和 @JsonSerialize
因为当你使用 @JsonSerializer
时,Jackson 将始终写字段名。
这里是完整的解决方案:
public class CustomSerializer extends UnwrappingBeanSerializer {
public CustomSerializer(BeanSerializerBase src, NameTransformer transformer) {
super(src, transformer);
}
@Override
public JsonSerializer<Object> unwrappingSerializer(NameTransformer transformer) {
return new CustomSerializer(this, transformer);
}
@Override
protected void serializeFields(Object bean, JsonGenerator jgen, SerializerProvider provider) throws IOException, JsonGenerationException {
A a = (A) bean;
jgen.writeStringField("custom", a.getAProp());
jgen.writeStringField("custom3", a.getAProp());
}
@Override
public boolean isUnwrappingSerializer() {
return true;
}
}
测试用例,您应该使用自定义配置或研究其他方法重新定义您的对象映射器。
@RunWith(SpringJUnit4ClassRunner.class)
@WebAppConfiguration
@SpringApplicationConfiguration(classes = Application.class)
public class ColorsTest {
ObjectMapper mapper = new ObjectMapper();
@Before
public void setUp(){
mapper.registerModule(new Module() {
@Override
public String getModuleName() {
return "my.module";
}
@Override
public Version version() {
return Version.unknownVersion();
}
@Override
public void setupModule(SetupContext context) {
context.addBeanSerializerModifier(new BeanSerializerModifier() {
@Override
public JsonSerializer<?> modifySerializer(SerializationConfig config, BeanDescription beanDesc, JsonSerializer<?> serializer) {
if(beanDesc.getBeanClass().equals(A.class)) {
return new CustomSerializer((BeanSerializerBase) serializer, NameTransformer.NOP);
}
return serializer;
}
});
}
});
}
@Test
public void testSerializer() throws JsonProcessingException {
System.out.println(mapper.writeValueAsString(new B()));
}
}
B 类:
public class B {
@JsonProperty("bProp")
public String getBProp() {
return "bProp";
}
@JsonUnwrapped
public A getA() {
return new A();
}
}
关于java - Jackson @JsonUnwrapped 行为与自定义 JsonSerializer,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30846404/
我有一个相对复杂的对象,其中包含许多字段。我需要使用自定义序列化程序序列化其中一个字段,但需要模拟 @JsonUnwrapped 功能。 为了简单起见,我将其削减为两个字段: public class
我在 SpringBoot 的上下文中遇到了这个问题,但它似乎只是 Jackson 的问题。 我有一个包含多个字段的数据对象。 DataObject 包含在模型中。 DataObject 的所有字段都
我正在使用 jackson 2.1.0。鉴于: public static final class GetCompanies { private final List companies;
我有两门课: public class ResponseInfo { private final int code; private final String description;
我可以有条件地使用@JsonUnwrapped吗?我不想在序列化期间使用它,但想在反序列化对象时使用它。 一种方法是创建两个不同的类或创建一个子类来覆盖在序列化和反序列化时需要表现不同的属性。这听起来
当我在嵌套字段上使用@JsonUnwrapped时: public class Person{ private int id; @JsonUnwrapped private F
我有一个像这样的 POJO: class Registration { String name; @JsonUnwrapped ModifiableDetails detail
我知道 Gson 没有类似的功能,但是有没有办法像 @JsonUnwrap 那样添加对展开 Json 字段的支持? 目标是允许这样的结构: public class Person { publ
我有两个这样的类: public class A { String aProp = "aProp"; public String getAProp() { return
假设我有以下类(class): public class Parent { public int age; @JsonUnwrapped public Name name; } 生成 JS
我有一个对象,其中包含另一个对象属性,如下所示: import com.fasterxml.jackson.annotation.JsonPropertyOrder; import com.faste
我想做什么 我想使用 Jackson 反序列化多态类型,使用标准 @JsonTypeInfo 注释,如下所示: @JsonTypeInfo(use = JsonTypeInfo.Id.NAME,
我正在尝试编写一个简单的类来验证 JSON 输入字符串是否可以转换为目标 JAVA 对象。如果在输入 JSON 字符串中发现任何未知字段,则 validator 应该失败。这一切都按预期工作,除非我用
我有一个 POJO,其中包含另一个 POJO: public class Outer { private Long id; private String name; @Json
所以,我有这个类,使用 @EmbeddedId 和 @JsonUnwrapped 注释 @Entity class Order { @EmbeddedId @JsonUnwrapped
我有一个类: class Car { private Engine myEngine; @JsonProperty("color") private String myColo
我想使用组合模式来重用类的公共(public)部分,就像我在 Jackson 中使用 @JsonUnwrapped 所做的那样,而不在 mongodb 文档中添加额外级别的结构,例如: class A
我是一名优秀的程序员,十分优秀!