如何在java中对JSON对象进行排序?

问题描述 投票:7回答:5

我一直在寻找一段时间,想要一种方法来排序这样的JSON对象:

{"results": [
  {
    "layerId": 5,
    "layerName": "Pharmaceutical Entities",
    "attributes": {
      "OBJECTID": "35",
      "FACILITYTYPE": "Pharmacy",
      "FACILITYSUBTYPE": "24 Hr Pharmacy",
      "COMMERCIALNAME_E": "SADD MAARAB PHARMACY"
      },
    "geometryType": "esriGeometryPoint",
   },
  {
    "layerId": 5,
    "layerName": "Pharmaceutical Entities",
    "attributes": {
      "OBJECTID": "1",
      "FACILITYTYPE": "Pharmacy",
      "FACILITYSUBTYPE": "24 Hr Pharmacy",
      "COMMERCIALNAME_E": "GAYATHY HOSPITAL  PHARMACY"
    },
    "geometryType": "esriGeometryPoint",
  },
     {
    "layerId": 5,
    "layerName": "Pharmaceutical Entities",
    "attributes": {
      "OBJECTID": "255",
      "FACILITYTYPE": "Pharmacy",
      "FACILITYSUBTYPE": "24 Hr Pharmacy",
      "COMMERCIALNAME_E": "AL DEWAN PHARMACY"
      },
    "geometryType": "esriGeometryPoint",
   }
]}

并按“COMMERCIALNAME_E”的值按字母顺序排序:

{"results": [
   {
    "layerId": 5,
    "layerName": "Pharmaceutical Entities",
    "attributes": {
      "OBJECTID": "255",
      "FACILITYTYPE": "Pharmacy",
      "FACILITYSUBTYPE": "24 Hr Pharmacy",
      "COMMERCIALNAME_E": "AL DEWAN PHARMACY"
      },
    "geometryType": "esriGeometryPoint"
   },
  {
    "layerId": 5,
    "layerName": "Pharmaceutical Entities",
    "attributes": {
      "OBJECTID": "1",
      "FACILITYTYPE": "Pharmacy",
      "FACILITYSUBTYPE": "24 Hr Pharmacy",
      "COMMERCIALNAME_E": "GAYATHY HOSPITAL  PHARMACY"
       },
    "geometryType": "esriGeometryPoint"
   },
   {
    "layerId": 5,
    "layerName": "Pharmaceutical Entities",
    "attributes": {
      "OBJECTID": "35",
      "FACILITYTYPE": "Pharmacy",
      "FACILITYSUBTYPE": "24 Hr Pharmacy",
      "COMMERCIALNAME_E": "SADD MAARAB PHARMACY"
      },
    "geometryType": "esriGeometryPoint"
   }
]}

我找不到任何可以执行此操作的代码。谁能给我一些帮助?

java json
5个回答
6
投票

将这些JSON解析为对象集合,并使用比较器使用首选字段对其进行排序。

例:

import com.google.gson.Gson;

class Person {
  private int age;
  private String name;
}

String json = "{'age':22,'name':'Jigar'}";
Gson gson = new Gson();
TestJsonFromObject obj = gson.fromJson(json, Person.class);  

如果要从Object创建JSON。

Person p = new Person();
p.setName("Jigar");
p.setAge(22);
String jsonStr = new com.google.gson.Gson().toJson(obj);

12
投票

我使用JSON简单API对此进行排序。这是我的代码:

import java.io.FileReader;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;

import org.json.simple.JSONArray;
import org.json.simple.JSONObject;
import org.json.simple.parser.JSONParser;

public class SortJSON {

public static void main(String[] args) {
    JSONParser parser = new JSONParser();
    try {
        JSONObject o = (JSONObject) parser.parse(new FileReader("test3.json"));
        JSONArray array = (JSONArray) o.get("results");
        ArrayList<JSONObject> list = new ArrayList<>();

        for (int i = 0; i < array.size(); i++) {
            list.add((JSONObject) array.get(i));
        }
        Collections.sort(list, new MyJSONComparator());

        for (JSONObject obj : list) {
            System.out.println(((JSONObject) obj.get("attributes")).get("OBJECTID"));
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
}

}

class MyJSONComparator implements Comparator<JSONObject> {

@Override
public int compare(JSONObject o1, JSONObject o2) {
    String v1 = (String) ((JSONObject) o1.get("attributes")).get("COMMERCIALNAME_E");
    String v3 = (String) ((JSONObject) o2.get("attributes")).get("COMMERCIALNAME_E");
    return v1.compareTo(v3);
}

}

3
投票

Boon提供JSON排序,搜索,过滤等功能。

查看:

http://www.dzone.com/links/r/sorting_for_java_instances_maps_java_collections.html(Boon Sorting)

    Object jsonObject = fromJson(json);
    List<?> jsonDepartments = (List<?>) jsonObject;
    List<?> jsonEmployees = (List<Employee>) atIndex(jsonDepartments, "employees");

    sort(employees); //natural sort


    sort( employees, "lastName"); //sort by last name



    sort( departmentList ); //natural sort



    sort( employees, sortBy( "department.name" ),
                     sortByDescending( "lastName" ),
                     sortBy( "firstName" ) ); //you get the idea



    sort(employees,
            sortBy("contactInfo.phoneNumbers[0]")); //you can even sort by a path expression




    sort( employees,
            sortByDescending("contactInfo.phoneNumbers[0]") ); //backwards by a path expression


    max(employees); //gets the max (natural order employee)


    greatest(employees, 5); //gets the top five


    min(employees); //gets the lowest



    least(employees, 5); //gets the lowest five


    max(employees, "salary"); //gets the top salaried employee

    greatest(employees, "salary", 5); //gets the top five salaried employees


    min(employees, "salary"); //the least

    least(employees, "salary", 5); //the lowest five salaried employees

Boon目前也是JVM上最快的JSON解析器(大约在2014年3月)。


2
投票

你可以在JSON数组周围写一个List<JSONObject>包装器,然后使用Collections.sort和自定义的Comparator<JSONObject>


0
投票

我用杰克逊去做。下面是排序方法实现,您可以添加更多检查并添加返回类型

 public void sort(String data) throws IOException {
    JsonNode node = new ObjectMapper().readTree(data);
    ArrayNode array = (ArrayNode) node.get("results");
    Iterator<JsonNode> i =array.elements();
    List<JsonNode> list = new ArrayList<>();
    while(i.hasNext()){
        list.add(i.next());
    }
    list.sort(Comparator.comparing(o -> o.get("attributes").get("COMMERCIALNAME_E").asText()));
}
© www.soinside.com 2019 - 2024. All rights reserved.