我正在用java编写
我有一个包含数组的json,我正在尝试拆分该数组(展平),数组中的每个元素应该是独立的。
我正在使用org.json.JSONObject
库来解析json(但也可以使用其他类)
示例:
{
"key": "123456",
"date": "2018-01-01",
"users": [
{"name": "jim", "age": 20},
{"name": "jack", "age": 21}
]
}
结果:
[
{
"key": "123456",
"date": "2018-01-01",
"users": {"name": "jim", "age": 20}
},
{
"key": "123456",
"date": "2018-01-01",
"users": {"name": "jack", "age": 21}
}
]
有现成的库吗?
编辑:
我正在寻找一个通用的解决方案,json 可以有不同的字段,我唯一知道的是 arrar 的路径(示例中的users
)
最佳答案
您可以使用几乎任何可用的 JSON 解析库来解决它。例如,我将使用 Jackson 来完成此操作。您很可能已经有了用于条目的数据类 (POJO)。这就是我对这种层次结构的看法
BaseDataView
代表公共(public)字段
import java.util.Date;
public abstract class BaseDataView {
protected String key;
protected Date date;
// public get/set
}
OldDataView
代表您的旧 View
import java.util.Collections;
import java.util.List;
import java.util.stream.Collectors;
public class OldDataView extends BaseDataView {
private List<User> users;
public List<User> getUsers() {
return users;
}
@Override
public String toString() {
return "Data [key=" + key + ", date=" + date + ", users=" + users + "]";
}
public List<NewDataView> toNewData() {
if (users != null && !users.isEmpty()) {
return users.stream().map(u -> new NewDataView(key, date, u))
.collect(Collectors.toList());
} else {
return Collections.singletonList(new NewDataView(key, date, null));
}
}
}
NewDataView
代表我们的新 View
import java.util.Date;
public class NewDataView extends BaseDataView {
private User users;
public NewDataView() {
super();
}
public NewDataView(String key, Date date, User users) {
super();
this.key = key;
this.date = date;
this.users = users;
}
public User getUsers() {
return users;
}
public void setUsers(User users) {
this.users = users;
}
@Override
public String toString() {
return "NewData [key=" + key + ", date=" + date + ", users=" + users + "]";
}
}
主类将读取值,将其转换并写入字符串。
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.List;
import com.fasterxml.jackson.databind.ObjectMapper;
public class StackExample {
public static void main(String[] args) throws IOException {
ObjectMapper mapper = new ObjectMapper();
mapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd"));
String input = "{\"key\": \"123456\",\"date\": \"2018-01-01\",\"users\":"
+ " [{\"name\": \"jim\", \"age\": 20},{\"name\": \"jack\", \"age\": 21}]}";
OldDataView d = mapper.readValue(input, OldDataView.class);
List<NewDataView> nd = d.toNewData();
String ret = mapper.writeValueAsString(nd);
System.out.println(ret);
}
}
这将产生所需的结果。当然,如果您愿意在 JSON 表示中的 users
字段中添加 [] 括号,您可以摆脱 NewDataView
类。您还可以使用各种注释来自定义格式。
希望对你有帮助!
关于java - 用java分割嵌套在json中的数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49750548/