我想使用杰克逊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;}
}
只需用批注< 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 两个答案