Построить дерево JSON с помощью рекурсии - PullRequest
0 голосов
/ 20 февраля 2020

Я хочу рекурсивно создать дерево JSON из нескольких строк. Строка может выглядеть так:

.this.is:0.a.test 

Символьная строка интерпретируется следующим образом:

  • . является объектом
  • : является массивом
  • :0. - первый объект в массиве

Соответствующий JSON выглядит следующим образом

{
   "this":{
      "is":[
         {
            "a":{
               "test":"testvalue"
            }
         }
      ]
   }
}

Мой код выглядит следующим образом:

public static JsonNode recursiveLimb(ArrayList<String> limb, Map<String, String> mappingBodyMap, BidiMap<String, String> bidiMap, JsonNode currentTree, String path) {

        if (!limb.isEmpty() && limb.get(0).equals(".")) {
            //object node

            String firstElem = limb.remove(0);
            String secondElem = limb.remove(0);
            //call recursion to build rest of tree
            JsonNode resultJN = recursiveLimb(limb, mappingBodyMap, bidiMap, currentTree, path + firstElem + secondElem);

            return mapper.createObjectNode().set(secondElem, resultJN);

        } else if (!limb.isEmpty() && limb.get(0).equals(":")) {
            //array node

            String firstElem = limb.remove(0);
            String secondElem = limb.remove(0);
            //call recursion to build rest of tree
            JsonNode resultJN = recursiveLimb(limb, mappingBodyMap, bidiMap, currentTree, path + firstElem + secondElem);

            return mapper.createArrayNode().add(resultJN);

        } else {
            //value node 

            String value = bidiMap.getKey(path);
            return new TextNode(mappingBodyMap.get(value));
        }
    }

Этот код возвращает все отдельные ссылки дерева. Проблема в том, что мне трудно собрать их вместе. Надеюсь, кто-нибудь сможет мне помочь. У кого-нибудь есть идеи, что я могу сделать?

1 Ответ

1 голос
/ 20 февраля 2020

Я думаю, что вместо использования этого было бы проще создать строку и преобразовать ее в JSON в конце. Пример: .life.is: 0.so.good -> Мы начинаем чтение с конца;

  1. Находим. мы создаем так: {good = goodValue}
  2. Находим: 0. is: [{so: {good = goodValue}}]
  3. Мы находим. life: {is: [{so: {good = goodValue}}]}
  4. Мы находим последнее. мы добавили {life: {is: [{so: {good = goodValue}}]}}

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

...