Преобразование иерархической строки JSON в объекты Java

Мне нужно преобразовать иерархическую строку JSON в некоторую структуру объектов в Java. Все объекты одного типа, но могут быть вложены неограниченное количество раз. Еще мне нужно было следить за порядком. Какая библиотека может сделать это за меня автоматически?

Строка JSON выглядит так:

  {
  "type": "group",
  "id": "3b7034d4-a336-4ed5-bef2-363d7a48c55e",
  "name": "group1.0",
  "pid": "null",
  "models": [
    {
      "type": "model",
      "id": "aaa01dd3-abe4-4d50-a69e-62b04199b7c5",
      "name": "analysis2",
      "pid": "3b7034d4-a336-4ed5-bef2-363d7a48c55e"
    },
    {
      "type": "model",
      "id": "aaa01dd3-abe4-4d50-a69e-62b04199b7c5",
      "name": "analysis2",
      "pid": "3b7034d4-a336-4ed5-bef2-363d7a48c55e"
    },
    {
      "type": "group",
      "id": "12704d4a-a840-433a-bcf1-eb6a32af2e0d",
      "name": "group 1.2",
      "pid": "3b7034d4-a336-4ed5-bef2-363d7a48c55e",
      "groups": [
        {
          "type": "group",
          "id": "b82b479f-18ce-4eca-a464-2e17f37238a0",
          "name": "group 1.2.1",
          "pid": "12704d4a-a840-433a-bcf1-eb6a32af2e0d"
        },
        {
          "type": "group",
          "id": "3c36995a-2f75-4805-bfa8-09fdf92bc6ec",
          "name": "1.2.1.1",
          "pid": "b82b479f-18ce-4eca-a464-2e17f37238a0"
        }
      ]
    }
  ]
}

И я хочу преобразовать это примерно так:

item[1].id == "3b7034d4-a336-4ed5-bef2-363d7a48c55e"
item[1].name== "group1.0"
item[1].depth == "1"

...

item[6].id == "3c36995a-2f75-4805-bfa8-09fdf92bc6ec"
item[6].name== "1.2.1.1"
item[6].depth == "4"

РЕДАКТИРОВАТЬ 1: Я использовал JACKSON, как было рекомендовано, вот мой код, но я столкнулся с проблемой, что он не работает рекурсивно, а создает только один объект и помещает подсписки в атрибуты. Но мне нужна карта объектов.

    try {
    Map<String,Item> map = new HashMap<String,Item>();
    ObjectMapper mapper = new ObjectMapper();

    map = mapper.readValue(json, new TypeReference<HashMap>(){});

     Iterator it = map.entrySet().iterator();
        while (it.hasNext()) {
            Map.Entry pair = (Map.Entry)it.next();
            System.out.println(pair.getKey() + " = " + pair.getValue());
            it.remove(); // avoids a ConcurrentModificationException
        }           
} catch (IOException e) {
    e.printStackTrace();

    public static class Item{
    public String type;
    public String id;
    public String name;
    public String pid;
    public List<Item>  models;
    public List<Item> groups;

    void Item(String ptype, String xid, String pname,String ppid, List<Item> pmodels,List<Item> pgroups) {
        type = ptype;
        id = xid;
        name = pname;
        pid = ppid;
        models = pmodels;
        groups = pgroups;   
    }
}
Джексон.
Andy Turner 05.10.2018 09:43

спасибо @AndyTurner

jokuja 05.10.2018 11:01

Я обновил свой код, столкнувшись с проблемой, что он не работает для меня рекурсивно.

jokuja 05.10.2018 13:07
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
3
521
1

Ответы 1

это пример:

String jsonString = <your jsonString>;


JSONArray topArray = null; 
try {
     // Getting your top array

     // THIS IS NOT NEEDED ANYMORE 
     //topArray = json.getJSONArray(jsonString);

     //use this instead
     topArray = new JSONArray(jsonString);

      // looping through All elements
      for(int i = 0; i < topArray.length(); i++){
      JSONObject c = topArray.getJSONObject(i);

      //list holding row data
      List<NodePOJO> nodeList = new ArrayList<NodePOJO>(); 

      // Storing each json item in variable
      String nodeName = c.getString("nodeName");
      String nodeID = c.getString("nodeID");

      NodePOJO pojo = new NodePOJO();
      pojo.setNodeName(nodeName);
      //add rest of the json data to NodePOJO class

      //the object to list
      nodeList.add(pojo);

    }
} catch (JSONException e) {
        e.printStackTrace();
 }

Например, спасибо, но мой JSON не является JSONArray, и эта команда не создает наш массив: "topArray = new JSONArray (response);" Это вложенный JSON, как вы можете видеть выше, и ваше решение также не работает рекурсивно :)

jokuja 05.10.2018 13:43

Другие вопросы по теме