当前位置: 首页 > 面试题库 >

使用Jackson PTH和Spring Data MongoDB DBRef的Java到JSON序列化生成额外的目标属性

范彭亮
2023-03-14
问题内容

从Java序列化为JSON时,target当使用@DBRef带有延迟加载和Jackson的多态类型处理的Spring Data MongoDB
批注时,Jackson会为引用的实体生成一个额外的属性。为什么会发生这种情况,并且可以省略多余的target属性?

代码示例

@Document(collection = "cdBox")
public class CDBox {
  @Id
  public String id;

  @DBRef(lazy = true)
  public List<Product> products;
}

@Document(collection = "album")
public class Album extends Product {
  @DBRef(lazy = true)
  public List<Song> songs;
}

@Document(collection = "single")
public class Single extends Product {
  @DBRef(lazy = true)
  public List<Song> songs;
}

@Document(collection = "song")
public class Song {
  @Id
  public String id;

  public String title;
}

@JsonTypeInfo(use = JsonTypeInfo.Id.NAME,
                    property = "productType",
                    include = JsonTypeInfo.As.EXTERNAL_PROPERTY)
@JsonSubTypes(value = {
    @JsonSubTypes.Type(value = Single.class),
    @JsonSubTypes.Type(value = Album.class)
})
public abstract class Product {
  @Id
  public String id;
}

生成的JSON

{
  "id": "someId1",
  "products": [
    {
      "id": "someId2",
      "songs": [
        {
        "id": "someId3",
        "title": "Some title",
        "target": {
          "id": "someId3",
          "title": "Some title"
          }
        }
      ]
    }
  ]
}

问题答案:

“目标”字段由Spring Data添加,因为它是一个惰性集合。因此就像Hibernate for JPA中的datahandler等。

选项1:要忽略它们,您只需要在类级别添加@JsonIgnoreProperties(value = {“ target”})

@Document(collection = "song")
@JsonIgnoreProperties(value = { "target" })
public class Song {
 ...
}

选项2:使集合不懒惰



 类似资料:
  • 问题内容: 我在MVC 4程序中使用Json.net。 我有一个阶级的对象。 我做了: 现在,我想添加一个额外的属性,如成。 我如何使用Json.net实现这一目标? 问题答案: 您有几种选择。 正如@Manvik所建议的那样,最简单的方法就是在类中添加另一个属性并在序列化之前设置其值。 如果您不想这样做,那么下一个最简单的方法是将您的对象加载到中,追加新属性值,然后从那里写出JSON。这是一个简

  • 我有一个pojo类,例如: A类Pojo: 现在,在从spring REST API返回field3时,我希望将其转换为 输入:字段3-312548 输出字段3-“312548” 为此,我编写了自定义类JsonSerializer: 自定义JsonSerializer: 如果我使用这个注释,它会在内部操作时转换它,从而导致已经编写的基于整数的逻辑失败。因此,我想以这样一种方式配置它,对于所有内部操

  • 试图将JSON反序列化为我创建的Java bean。对杰克逊和这项努力来说真的很新鲜,所以请容忍我。我有以下几点: 由于JSON中的对象被反复使用,我的Java Bean被分解为几个部分,因此: ...和以类似方式实现的另一个BlockBean类(为简洁起见省略)。我使用杰克逊来完成这个任务,我的问题是——杰克逊中是否有序列化和反序列化的机制?理想情况下,我想要这样的东西(下面是伪代码,因为我无法

  • 问题内容: 我正在尝试确定是否可以发布表格之外的其他数据。 这是我认为可行的方法,但仅发送而不发送表单数据。 有人有什么想法吗? 问题答案: 您可以使用 [docs]并添加其他数据:

  • 问题内容: 我是C ++的新手。使用序列化和反序列化类型数据的最简单方法是什么。我发现了一些使用示例,但它们对我来说是晦涩的。 问题答案: 请注意,将键解释为路径,例如,将对“ ab” =“ z”放置将创建{“ a”:{“ b”:“ z”}} JSON,而不是{“ ab”:“ z”} 。否则,使用是微不足道的。这是一个小例子。

  • 问题内容: 是否可能:在类中有一个字段,而在Jackson库中进行序列化/反序列化时却为其使用不同的名称? 例如,我有“ Coordiantes”类。 对于从JSON反序列化,希望具有以下格式: 但是当我序列化对象时,结果应该是这样的: 我试图通过在getter和setter上都应用注释(具有不同的值)来实现此目的: 但我有一个例外: org.codehaus.jackson.map.exc.Un