我在用java写作
我有一个包含数组的json,我试图拆分数组(flattening),数组中的每个元素都应该是独立的。
我使用public override void Navigate(string uri)
{
_navigationService.NavigateTo(nameof(EditProfilePage));
}
库来解析json(但也可以使用其他类)
示例:
org.json.JSONObject
结果:
{
"key": "123456",
"date": "2018-01-01",
"users": [
{"name": "jim", "age": 20},
{"name": "jack", "age": 21}
]
}
有没有现成的库?
修改
我正在寻找一个通用的解决方案,json可以有不同的字段,我唯一知道的是arrar的路径(示例中为[
{
"key": "123456",
"date": "2018-01-01",
"users": {"name": "jim", "age": 20}
},
{
"key": "123456",
"date": "2018-01-01",
"users": {"name": "jack", "age": 21}
}
]
)
答案 0 :(得分:0)
您可以使用几乎任何可用的JSON解析库来解决它。例如,我将使用Jackson执行此操作。您很可能已经为您的条目提供了数据类(POJO)。这是我对这种等级的看法
BaseDataView
代表公共字段
import java.util.Date;
public abstract class BaseDataView {
protected String key;
protected Date date;
// public get/set
}
OldDataView
代表您的旧观点
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
代表我们的新观点
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);
}
}
这将产生所需的结果。当然,如果你没事,你可以摆脱NewDataView
课程,你的JSON表示中的users
字段中会有额外的[]括号。您还可以使用各种注释来自定义格式。
希望它有所帮助!
答案 1 :(得分:0)
这是我写的方法:
import org.json.JSONArray;
import org.json.JSONObject;
public static JSONArray parse(JSONObject json, String key) {
JSONArray flattenedJson = new JSONArray();
JSONArray arr = json.getJSONArray(key);
json.remove(key);
for (int i = 0; i < arr.length(); i++){
JSONObject jscopy = new JSONObject(json.toString()); // cloning the json
jscopy.put(key, arr.get(i));
flattenedJson.put(jscopy);
}
return flattenedJson;
}
使用它:
public static void main(String[] args) {
String jsonStr = "{key: 12345 ,date: '2018-01-01', users: [{name: jim, age: 20},{name: jack, age: 21}]}";
JSONObject json = new JSONObject(jsonStr);
JSONArray flattenedJson = parse(json, "users");
System.out.println(flattenedJson.toString());
}
输出:
➜ [{"date":"2018-01-01","key":12345,"users":{"name":"jim","age":20}},
{"date":"2018-01-01","key":12345,"users":{"name":"jack","age":21}}]
答案 2 :(得分:0)
您必须手动解析您的展平要求。我对answer中的parse
方法进行了一些改进建议。
而不是
JSONObject jscopy = new JSONObject(json.toString()); // cloning the json
要克隆阵列剥离的json,请使用以下命令:
JSONObject jscopy = new JSONObject(json, JSONObject.getNames(json));
这将更快,并将避免序列化/反序列化(以json术语)
您还可以评估for循环之前和之外的JSONObject.getNames(json)
部分,并在循环中使用已评估的String[]
。