当前位置: 首页 > 知识库问答 >
问题:

使用Jackson对JSON进行对象引用的数据结构序列化

冷吉星
2023-03-14

我想使用杰克逊2.13.3将数据结构序列化为JSON。我创建了一个简化的示例数据结构来显示所需的序列化是什么。

数据结构由一个主Container组成,其中包含一个Element的列表。元素之间有一些链接。

在示例中,我创建了元素的以下链接结构:

startTop <--> endTop
    ^          ^
    |          |
    |          |
    v          v
    startBottom     <-->     endBottom

目标是序列化通过链接信息的ID表示链接数据。元素的完全序列化应该只发生在容器的顶级列表中。这与jackson在序列化过程中遇到元素的顺序不一致。

我想得到以下输出:

{
    "allElements": [{
            "id": "startBottom",
            "successor": "endBottom",
            "predecessor": null,
            "upperNeighbours": ["startTop", "endTop"],
            "lowerNeighbours": null
        },
        {
            "id": "endBottom",
            "successor": null,
            "predecessor": "startBottom",
            "upperNeighbours": null,
            "lowerNeighbours": null

        },
        {
            "id": "startTop",
            "successor": "endTop",
            "predecessor": null,
            "upperNeighbours": null,
            "lowerNeighbours": ["startBottom"]
        },
        {
            "id": "endTop",
            "successor": null,
            "predecessor": "startTop",
            "upperNeighbours": null,
            "lowerNeighbours": ["startBottom"]
        }
    ]
}
import com.fasterxml.jackson.annotation.JsonIdentityInfo;
import com.fasterxml.jackson.annotation.ObjectIdGenerators;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.ObjectWriter;
import java.util.List;

public class Test {
  public static void main(String[] args) throws JsonProcessingException {
    Element startBottom = new Element("startBottom");
    Element endBottom = new Element("endBottom");
    Element startTop = new Element("startTop");
    Element endTop = new Element("endTop");

    startBottom.setSuccessor(endBottom);
    startTop.setSuccessor(endTop);
    endBottom.setPredecessor(startBottom);
    endTop.setPredecessor(startTop);

    startBottom.setUpperNeighbours(List.of(startTop, endTop));
    startTop.setLowerNeighbours(List.of(startBottom));
    endTop.setLowerNeighbours(List.of(startBottom));

    Container container = new Container();
    container.setAllElements(List.of(startBottom, endBottom, startTop, endTop));

    ObjectMapper mapper =
        new ObjectMapper().configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
    ObjectWriter prettyPrintWriter = mapper.writerWithDefaultPrettyPrinter();
    System.out.println(prettyPrintWriter.writeValueAsString(container));
  }
}

class Container {
  public List<Element> getAllElements() {return allElements;}
  public void setAllElements(List<Element> allElements) {this.allElements = allElements;}
  private List<Element> allElements;
}

@JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class,
    property = "id")
class Element {
  Element(String id) {this.id = id;}

  private String id;

  // May be null
  private Element successor;

  // May be null
  private Element predecessor;

  // May be empty, which for us is the same as being null
  private List<Element> upperNeighbours;

  // May be empty, which for us is the same as being null
  private List<Element> lowerNeighbours;

  public String getId() {return id;}

  public void setId(String id) {this.id = id;}

  public Element getSuccessor() {return successor;}

  public void setSuccessor(Element successor) {this.successor = successor;}

  public Element getPredecessor() {return predecessor;}

  public void setPredecessor(Element predecessor) {this.predecessor = predecessor;}

  public List<Element> getUpperNeighbours() {return upperNeighbours;}

  public void setUpperNeighbours(List<Element> upperNeighbours) {this.upperNeighbours = upperNeighbours;}

  public List<Element> getLowerNeighbours() {return lowerNeighbours;}

  public void setLowerNeighbours(List<Element> lowerNeighbours) {this.lowerNeighbours = lowerNeighbours;}
}

共有1个答案

严兴旺
2023-03-14

只需用批注< code>@JsonIgnore标记您的类< code >元素中的成员< code>successor和< code>predecessor,以防止无限循环。你的代码应该可以工作。但我甚至可以提出一些建议,让事情变得更简单。我编写了自己的实用程序,允许您将任何类序列化为Json,并从Json反序列化回类的实例。它使用引擎盖下的杰克逊图书馆。为您完成这项工作的代码很简单,如下所示:

try {
  System.out.println(JsonUtils.writeObjectToJsonString(container));
}catch(IOException ioe) {
  //Handle exception
}

其中容器是容器类的实例。下面是 Javadoc 的类 JsonUtils。这个类是我编写和维护的MgntUtils库的一部分。该库可以作为 Maven 工件或在 Github 上获得(包括源html" target="_blank">代码和 Javadoc)

 类似资料:
  • 我目前正在开发一个Java web应用程序,它使用Magento REST API公开的JSON数据。api返回的数据示例如下: 我的应用程序中有一个Java类,如下所示: 我想对数据进行反序列化,并将其转换为,但我总是得到以下错误: 这是我用来将JSON响应反序列化为ArrayList的语句行: 有人能分享一些见解吗?我看到一些例子,返回的JSON对象前面没有任何ID。那是因为我做错了什么吗?非

  • 问题内容: 我有一个像这样的简单容器类的结构(在伪红宝石中): 有没有简单的方法可以在Ruby中将其反序列化为JSON?还是应该像本例一样为每个类制作嵌套的序列化方法? 编辑: 在我的特定情况下,我想将一些JSON数据发布到运行Ruby的服务器上,该服务器将提取数据并采取相应的措施。 JSON的发送者不一定是Ruby进程,而可能是其他系统的后端。(尽管在我的测试工具中是Ruby)。 因此,我不需要

  • 我正在尝试反序列化JSON对象,例如 Java子对象引用父对象的对象,例如: 像这样反序列化时,子对象#父对象不会指向父对象。我在做在线研究时读到了两种方法,但非似乎有效。 1.向类添加构造函数arg以设置父对象 执行此操作时,我得到错误: 2.使用和注释 此操作失败: JsonBackReference的JavaDoc说它不能应用于集合,所以它显然不起作用,但我想知道为什么在线上有这么多例子将它

  • 问题内容: 我想知道,什么是JSON中的对象列表的正确结构。 我们正在使用JAXB将POJO转换为JSON。 这是选择,请告诉我什么是对的。 要么 如果第一个结构正确,那么我应该使用什么JAXB注释来获得正确的结构。 问题答案: 第一个是无效的语法。您不能在普通数组中包含对象属性。第二个是正确的,尽管它不是 严格的 JSON。这是JSON 的一种 宽松 形式,其中省略了字符串键中的引号。 Patr

  • 下面有一个实体类,有两个字符串字段:name和description。description字段将包含一个原始JSON值,例如{“abc”:123} 如果存在@JSONRAWValue注释,建议如何将创建的JSON字符串编组回to Entity对象?我是不是遗漏了另一个注释? 谢谢

  • 我在使用spring反序列化json数组时遇到一个问题。我有来自服务的json响应: 我使用spring WebFlux的新WebClient获得了这个json,代码如下: AccountorDerList AccountOrder是一个映射字段的简单pojo。 实际上,当我点击get时,它说: 如何使用新的webflux模块正确反序列化json?我做错了什么? 更新05/02/2018 两个答案