1

在我的应用程序中,我有 Serie,每个都有 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 来描述我的文件字段。

使用 Jackson 库,它会生成一个这样的 json:

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

我想这样生成:

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

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

@Entity
public class Serie extends Model {

    @JsonUnwrapped
    public File obj;

    public File texture;
}

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

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

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

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

4

3 回答 3

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;
    }
}

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

于 2013-03-29T13:23:58.190 回答
1

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

@Entity
public static class File {
    public String path;

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

}

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

于 2013-03-28T18:01:47.670 回答
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;
    }
}
于 2015-09-03T10:35:37.380 回答