用java处理JSON数组

用java处理JSON数组,java,json,Java,Json,我有以下清单 [{ "frd": "2017-06-30", "tim": "2017-01-19T11:02:21.847", "tpr": 2276.5 }, { "frd": "2017-06-29", "tim": "2017-01-19T11:02:21.847", "tpr": 2408.5 }, { "frd": "2017-06-28", "tim": "2017-01-20T12:01:08.3

我有以下清单

  [{
    "frd": "2017-06-30",
    "tim": "2017-01-19T11:02:21.847",
    "tpr": 2276.5
  },
  {
    "frd": "2017-06-29",
    "tim": "2017-01-19T11:02:21.847",
    "tpr": 2408.5
  },
  {
    "frd": "2017-06-28",
    "tim": "2017-01-20T12:01:08.358",
    "tpr": 2408.5
  },
  {
    "frd": "2017-06-30",
    "tim": "2017-01-20T12:01:08.358",
    "tpr": 2276.5
  },
  {
    "frd": "2017-06-30",
    "tim": "2017-01-20T17:35:17.495",
    "tpr": 2408.5
  },
  {
    "frd": "2017-06-30",
    "tim": "2017-01-19T10:04:44.586",
    "tpr": 2276.5
  },
  {
    "frd": "2017-06-30",
    "tim": "2017-01-19T10:15:46.051",
    "tpr": 2276.5
  }]
我将从上述数据集创建一个多系列折线图。X轴变为tim值。Y轴变为tpr。行应按frd进行分组。因此,我试图获得一个新的
json
,它是根据上述数据绘制图表所需的

我试图获得不同的tim值

 Set<String> tims = new HashSet<String>();

    for (Record record : array) {
        tims.add(record.getTim());
    }

    List<String> sorted = new ArrayList<String>(tims);
    Collections.sort(sorted);
已编辑

我试过跟随

Set<String> d_tims = new HashSet<String>();

    for (Record record : array) {
        d_tims.add(record.getTim());
    }

    List<String> sorted = new ArrayList<String>(d_tims);
    Collections.sort(sorted);

    List<Map<String, String>> tims = new ArrayList<Map<String, String>>();

    for (String record : sorted) {
        Map<String, String> map = new HashMap<String, String>();
        map.put("tim", record);
        for (Record record1 : array) {
            if (record.equals(record1.getTim())){
                map.put(record1.getFrd(), record1.getTpr().toString());
            }
        }
        tims.add(map);
    }
Set d_tims=new HashSet();
for(记录:数组){
d_tims.add(record.getTim());
}
列表排序=新数组列表(d_tims);
集合。排序(已排序);
List tims=new ArrayList();
for(字符串记录:已排序){
Map Map=newhashmap();
地图放置(“tim”,记录);
for(记录1:array){
if(record.equals(record1.getTim())){
put(record1.getFrd(),record1.getTpr().toString());
}
}
tims.add(地图);
}
然后我得到了我期望的json数组。如果还有比这更好的方法,请发帖子


谢谢

如果您想使用Java 8和流式API,下面是代码:

final Record[] array = N.fromJSON(Record[].class, json); // Provided by open source library: AbacusUtil

// sorted by 'frd' and grouped by 'tim'
final Map<String, List<Record>> groupedByTim = Arrays.stream(array).sorted(Comparator.comparing(Record::getFrd))
        .collect(Collectors.groupingBy(e -> e.getTim()));
final List<Map<String, String>> result = new ArrayList<>();

for (Map.Entry<String, List<Record>> entry : groupedByTim.entrySet()) {
    Map<String, String> map = new LinkedHashMap<>();
    map.put("tim", entry.getKey());

    for (Record r : entry.getValue()) {
        map.put(r.getFrd(), r.getTpr());
    }
    result.add(map);
}

N.println(N.toJSON(result, JSC.create().setPrettyFormat(true))); // Provided by open source library: AbacusUtil
以下是不带空值的输出:

[
     {
         "tim":"2017-01-19T10:15:46.051", 
         "2017-06-30":"2276.5"
     }, 
     {
         "tim":"2017-01-20T17:35:17.495", 
         "2017-06-30":"2408.5"
     }, 
     {
         "tim":"2017-01-19T11:02:21.847", 
         "2017-06-29":"2408.5", 
         "2017-06-30":"2276.5"
     }, 
     {
         "tim":"2017-01-19T10:04:44.586", 
         "2017-06-30":"2276.5"
     }, 
     {
         "tim":"2017-01-20T12:01:08.358", 
         "2017-06-28":"2408.5", 
         "2017-06-30":"2276.5"
     }
 ]

转换为
列表
,并为列表中的每一个获取
tim
@m\u callens请检查编辑部分。我尝试了List并获得了预期的json。请说明是否有其他方法比我使用的更好,因为它可能有数千个数据。在您的示例数据中:“2017-06-28”:null,“如果没有映射,则必须显示‘tpr’,‘null’?如果没有映射,则必须显示‘tpr’,‘null’。我该怎么做?这里的“N”是什么?AbacusUtil中的一个实用类
Arrays.stream(array).sorted(Comparator.comparing(Record::getFrd))
    .collect(Collectors.toMap(Record::getTim, e -> {
        Map<String, String> map = new LinkedHashMap<>();
        map.put("tim", e.getTim());
        map.put(e.getFrd(), e.getTpr());
        return map;
    }, (a, b) -> {
        a.putAll(b);
        return a;
    })).values();
Stream.of(array).sorted(Comparator.comparing(Record::getFrd))
        .toMap(Record::getTim, e -> N.asLinkedHashMap("tim", e.getTim(), e.getFrd(), e.getTpr()), 
               (a, b) -> {
                a.putAll(b);
                return a;}).values();
[
     {
         "tim":"2017-01-19T10:15:46.051", 
         "2017-06-30":"2276.5"
     }, 
     {
         "tim":"2017-01-20T17:35:17.495", 
         "2017-06-30":"2408.5"
     }, 
     {
         "tim":"2017-01-19T11:02:21.847", 
         "2017-06-29":"2408.5", 
         "2017-06-30":"2276.5"
     }, 
     {
         "tim":"2017-01-19T10:04:44.586", 
         "2017-06-30":"2276.5"
     }, 
     {
         "tim":"2017-01-20T12:01:08.358", 
         "2017-06-28":"2408.5", 
         "2017-06-30":"2276.5"
     }
 ]