java - 用java分割嵌套在json中的数组

标签 java json

我正在用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/

相关文章:

java - 比较方法在使用 Spring Rest Template 时违反了它的一般契约

java - 通过bufferedReader从本地路径读取json文件构建html文件

java - Selenium Webdriver 测试用例 - 测试用例未按顺序执行

java - 我想从串行通信中分离数据并将其传递到表中

javascript - 使用字符串变量作为 json 对象名称

javascript - 启动时运行多个脚本的NodeJS包

java - 从具有非均匀权重的集合中绘制的实现

json - Azure Devops - 从一个任务输出 Json 对象并在另一任务中使用

javascript - 如何在javascript中使用uri解码大数字

java - Gson解析问题,空指针异常