用java嵌套在json中的split数组

时间:2018-04-10 09:51:08

标签: java json

我在用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} } ]

3 个答案:

答案 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[]