如何使用单个元素展开JsonObject并使用Jackson库保留JsonObject的名称?

时间:2013-03-28 16:29:30

标签: json playframework jackson

在我的应用程序中,我有Seri​​e,每个人都有2个字段来表示纹理和.obj文件。

@Entity
public class Serie extends Model {
    public File obj;
    public File texture;
}

我的文件类:

@Entity
public class File extends Model{
     public String path;
}

我想生成一个Json文件来描述我的对象。如您所见,File类只有一个字段。出于这个原因,我想生成一个没有JsonArray的Json来描述我的文件字段。

使用杰克逊库,它生成一个像这样的json:

{"obj":{"path":"obj/600s"}, "texture":{"path":"text/600s"}}

我想生成这样的:

{"obj":"obj/600s", "texture":"text/600s"}

一个部分有效的选项是使用Jackson的注释@JsonUnwrapped。

@Entity
public class Serie extends Model {

    @JsonUnwrapped
    public File obj;

    public File texture;
}

杰克逊使用它生成一个像这样的json:

    {"path":"obj/600s", "texture":{"path":"text/600s"}}

所以这对我不起作用,因为我不能用于obj,纹理字段,我想在json上保留字段的名称。

我知道这是一个具体的问题。无论如何,提前谢谢

3 个答案:

答案 0 :(得分:2)

您可以编写自定义getter来实现目标:

public class Serie extends Model {
    public File obj;
    public File texture;

    @JsonProperty("obj")
    public String getObjPath() {
        return obj.path;
    }

    @JsonProperty("texture")
    public String getTexturePath() {
        return texture.path;
    }
}

/我假设自动检测已关闭/

答案 1 :(得分:1)

您想要使用的是@JsonValue,但是不能在字段上设置注释,只能在方法(getter)上设置:

@Entity
public static class File {
    public String path;

    @JsonValue
    public String getPath() {
        return path;
    }

}

如果您只需要序列化,那么这就是您需要做的。如果还需要反序列化,则需要单个arg字符串构造函数或json的静态工厂方法才能反序列化数据。

答案 2 :(得分:0)

另一种解决方案:

@Entity
@JsonSerialize(using=com.fasterxml.jackson.databind.ser.std.ToStringSerializer)
public class File extends Model{
    public String path;

    // Could be generated by lombok:
    File(String path) {
        this.path = path;
    }

    @Override public String toString() {
        return path;
    }
}