Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/347.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使用Jackson序列化单值@Data对象而不嵌套(例如,{quot;id:123},而不是{quot;id:quot;{quot;value:123})?_Java_Json_Jackson_Lombok - Fatal编程技术网

Java 如何使用Jackson序列化单值@Data对象而不嵌套(例如,{quot;id:123},而不是{quot;id:quot;{quot;value:123})?

Java 如何使用Jackson序列化单值@Data对象而不嵌套(例如,{quot;id:123},而不是{quot;id:quot;{quot;value:123})?,java,json,jackson,lombok,Java,Json,Jackson,Lombok,我计划使用Lombok创建数百个基于“值对象”模式的类,如下所示: @Data public final class SomeId implements Serializable { private final long value; } public class SomeDTO { SomeId id; public SomeId getId() { return id; } } 我想将这些类用于Jackson支持的JSON序列化。例如,考虑

我计划使用Lombok创建数百个基于“值对象”模式的类,如下所示:

@Data
public final class SomeId implements Serializable {
    private final long value;
}
public class SomeDTO {
    SomeId id;
    public SomeId getId() {
        return id;
    }
}
我想将这些类用于Jackson支持的JSON序列化。例如,考虑一个DTO类如下:

@Data
public final class SomeId implements Serializable {
    private final long value;
}
public class SomeDTO {
    SomeId id;
    public SomeId getId() {
        return id;
    }
}
我希望DTO类被序列化为类似于
{“id”:123}
,但Jackson生成类似于
{“id”:{“value”:123}
,它附带了一个名为
value
的字段的不必要的嵌套对象。i、 e.测试用例表达了我的需求:

public class SomeDTOTest {
    @Test
    public void serializationTest() throws Exception {
        SomeDTO dto = new SomeDTO();
        dto.id = new SomeId(123);

        String serialized = new ObjectMapper().writeValueAsString(dto);

        System.out.println(serialized);             // {"id":{"value":123}}
        assertThat(serialized, is("{\"id\":123}")); // I want {"id":123} instead!
    }
}
我知道将
@JsonValue
注释放入
SomeId
类中的每个
getValue()
方法将是一个解决方案,但我不能这样做,因为
@Data
类没有实际的定义,因为Lombok会自动创建它

手动为每个类创建注释为
@JsonValue
的实际
getValue()
方法可能是另一种解决方案,但这意味着创建大量的模板代码


如何在没有样板代码的情况下实现此要求?

您可以为此类编写自定义序列化程序

例如:


我创建了一个接口,它有
getValue()
,注释为
@JsonValue

public interface LongValue {
    @JsonValue
    long getValue();
}
然后在每个
@Data
类中实现它。请注意,
getValue()
的实际实现将由Lombok自动生成:

@Data
public final class SomeId implements LongValue, Serializable {
    private final long value;
}

这样我就通过了测试
SomeDTOTest
-
SomeDTO
被序列化为
{id:123}

很好,但使用您的解决方案,我似乎需要为所有“value-object”类创建数百个
自定义序列化程序
,这将是我想要消除的另一个样板代码。为“值对象”类创建父类可能是一种选择,但我宁愿避免它,因为它会降低使用Lombok的好处。还有一种方法,但我不知道它是否对您有帮助:
public class SomeDTO{@jsonrapped SomeId;}
public class SomeId{@JsonProperty(value=“id”)private long value;}
您可以简单地用@JsonValue注释SomeId类中的value字段。您不需要注释getter这应该是公认的答案