如何在Java中以特定方式对JSON列编号排序
我在Spring Boot中开发了一个应用程序。用户可以上载CSV文件,其中包含数字和代码列。在Java代码中,我能够得到number列 CSV文件如何在Java中以特定方式对JSON列编号排序,java,json,spring-boot,Java,Json,Spring Boot,我在Spring Boot中开发了一个应用程序。用户可以上载CSV文件,其中包含数字和代码列。在Java代码中,我能够得到number列 CSV文件 number code 12 121 122 123 1211 1212 1231 124 我的目标和回应是: 回应-目标 json: [{ number: 12, child: [{number: 121, child: [{number: 1211 }, { number: 1212 }] }] },
number code
12
121
122
123
1211
1212
1231
124
我的目标和回应是:
回应-目标
json: [{ number: 12,
child: [{number: 121,
child: [{number: 1211 }, { number: 1212 }]
}]
}, {number: 122 },
{number: 123, child:[{number: 1231}] }.....etc
]
如何在Java中按父级和子级排列JSON结构?例如,12是121的父项,121是1211和1212的父项
更新:
输入值:
12
121
122
123
1211
1212
1231
14
141
142
1411
25
251
2511
2512
252
253
响应输出
response: [
{
"number": 12,
"child": [
{
"number": 121,
"child": [
{
"number": 1211
},
{
"number": 1212
}
]
},
[
{
"number": 122
}
],
[
{
"number": 123,
"child": [
{
"number": 1231
}
]
}
]
]
},
{
"number": 14,
"child": [
{
"number": 141,
"child": [
{
"number": 1411
}
]
},
[
{
"number": 142
}
]
]
},
{
"number": 25,
"child": [
{
"number": 251,
"child": [
{
"number": 2511
},
{
"number": 2512
}
]
},
[
{
"number": 252
}
],
[
{
"number": 253
}
]
]
}
]
创建一个具有两个字段的响应对象
public class Response() {
public int number;
public List<Response> children;
}
公共类响应(){
公共整数;
公开儿童名单;
}
这个类会给你你想要的。这不是真正的Java或JSON问题。简而言之,您的问题是-如何在知道列表元素之间的祖先-后代关系的情况下,将值列表组装到树结构中 我提出的算法是:
package tmpjavaproj;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.TreeSet;
import com.fasterxml.jackson.annotation.JsonInclude.Include;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
public class Test {
public static class Node implements Comparable<Node> {
public int number;
public List<Node> child; // Although this should actually be called children, not child
public int hashCode() {
return number;
}
public boolean equals(Node node) {
return number == node.number;
}
public int compareTo(Node node) {
return number - node.number;
}
}
public static void main(String[] args) throws Exception {
String[] inputs = { "12", "121", "122", "123", "1211", "1212", "1231", "14", "141", "142", "1411", "25", "251", "2511", "2512", "252", "253" };
Set<Node> roots = new TreeSet<>();
for (String input : inputs) {
Node node = new Node();
node.number = Integer.parseInt(input);
Node root = null;
for (Node rootCandidate : roots) {
if (input.startsWith(String.valueOf(rootCandidate.number))) {
root = rootCandidate;
break;
}
}
if (root == null) {
List<Node> rootsToChildren = new ArrayList<>();
for (Node aRoot : roots) {
if (String.valueOf(aRoot.number).startsWith(String.valueOf(node.number))) {
rootsToChildren.add(aRoot);
}
}
if (!rootsToChildren.isEmpty()) {
node.child = rootsToChildren;
roots.removeAll(rootsToChildren);
}
roots.add(node);
} else {
Node parentCandidate = root;
while (root != null) {
root = null;
if (parentCandidate.child != null) {
for (Node child : parentCandidate.child) {
if (input.startsWith(String.valueOf(child.number))) {
parentCandidate = child;
root = child;
}
}
}
}
if (parentCandidate.child == null) {
parentCandidate.child = new ArrayList<>();
}
parentCandidate.child.add(node);
}
}
Map<String, Set<Node>> response = new HashMap<>();
response.put("response", roots);
ObjectMapper mapper = new ObjectMapper();
mapper.enable(SerializationFeature.INDENT_OUTPUT);
mapper.setSerializationInclusion(Include.NON_NULL);
System.out.println(mapper.writeValueAsString(response));
}
}
包tmpjavaproj;
导入java.util.ArrayList;
导入java.util.HashMap;
导入java.util.List;
导入java.util.Map;
导入java.util.Set;
导入java.util.TreeSet;
导入com.fasterxml.jackson.annotation.JsonInclude.Include;
导入com.fasterxml.jackson.databind.ObjectMapper;
导入com.fasterxml.jackson.databind.SerializationFeature;
公开课考试{
公共静态类节点实现了可比较的{
公共整数;
public List child;//虽然这实际上应该称为children,而不是child
公共int hashCode(){
返回号码;
}
公共布尔等于(节点){
返回编号==node.number;
}
公共整数比较(节点){
返回编号-node.number;
}
}
公共静态void main(字符串[]args)引发异常{
字符串[]输入={“12”、“121”、“122”、“123”、“1211”、“1212”、“1231”、“14”、“141”、“142”、“1411”、“25”、“251”、“2511”、“2512”、“252”、“253”};
设置根=新树集();
for(字符串输入:输入){
节点=新节点();
node.number=Integer.parseInt(输入);
节点根=空;
用于(节点根候选:根){
if(input.startsWith(String.valueOf(rootCandidate.number))){
根=根候选;
打破
}
}
if(root==null){
List rootsToChildren=new ArrayList();
for(节点aRoot:根){
if(String.valueOf(aRoot.number).startsWith(String.valueOf(node.number))){
rootsToChildren.add(aRoot);
}
}
如果(!rootsToChildren.isEmpty()){
node.child=rootsToChildren;
根。removeAll(rootsToChildren);
}
根。添加(节点);
}否则{
节点parentCandidate=root;
while(root!=null){
root=null;
if(parentCandidate.child!=null){
对于(节点子节点:parentCandidate.child){
if(input.startsWith(String.valueOf(child.number))){
父母候选人=子女;
根=子;
}
}
}
}
if(parentCandidate.child==null){
parentCandidate.child=new ArrayList();
}
parentCandidate.child.add(节点);
}
}
Map response=newhashmap();
response.put(“response”,词根);
ObjectMapper mapper=新的ObjectMapper();
enable(SerializationFeature.INDENT_输出);
mapper.setSerializationInclusion(Include.NON_NULL);
System.out.println(mapper.writeValueAsString(response));
}
}
我不明白您是如何创建输出的。你能解释一下吗?@PaulErlenmeyer,谢谢你的重播,我的输出是json,创建json并输入值,在此之前我需要找到从数字中排序父项和子项的方法,我编辑了你的帖子,希望能澄清你的意思。如果不合适,请告诉我。我不确定这个JSON
响应是什么样子。父映射看起来像:{12=[121122123124],121=[1211212],122=[],123=[1231],124=[],1211=[],1212=[],1231=[]}
。如果121
在12
的child
数组中,那么为什么122
不是而是与12
在同一级别上存在呢。另一方面,为什么121
与12
不出现在同一级别?@MichałZiober,感谢您的重播,是的,我需要此类型:{12=[121,1]