Выполните итерацию по JSON и добавьте массив списка в объект / массив - PullRequest
1 голос
/ 04 ноября 2019

У меня есть два массива JSON:

{ 
  "Person": {
    "Info": [
      "name": "Becky",
      "age": 14
    ]
   },
  "Fruits": [
    {
      "name": "avocado",
      "organic": true
    },
    {
      "name": "mango",
      "organic": true
    }
  ],
  "Vegetables": [
    {
      "name": "brocoli",
      "organic": true
    },
    {
      "name": "lettuce",
      "organic": true
    }
  ]
}

Я пытаюсь использовать библиотеки Джексона и Gson, чтобы все выглядело красиво.

Как то так. Это прекрасно работает с Gson. Итак, вывод, который мне нужен:

{ 
  "Person": {
    "Info": [
      "name":"Becky",
      "age": 14
    ]
  },
  "FruitsList": {
    "Fruits": [
      {
        "name": "avocado",
        "organic": true
      },
      {
        "name": "mango",
        "organic": true
      }
    ]
  },
  "VegetablesList": {
    "Vegetables": [
      {
        "name": "brocoli",
        "organic": true
      },
      {
        "name": "lettuce",
        "organic": true
      }
    ]
  }
}

Я установил свои классы как:

class Person{
   private List<Info> InfoList;
   //Set and get were set
}

class Info{
   private String name;
   private int age;
   //Set and get were set
}

class Fruits{
   private String name;
   private boolean organic;
   //Set and get were set
   public String toString(){
            return "Fruits:{" +
            "name:'" + name+ '\'' +
            ", organic:" + organic+'\''+
            '}';
   }
 }

 class Vegetables{
   private String name;
   private boolean;
   //Set and get were set
   public String toString(){
            return "Fruits:[" +
            "name:'" + name+ '\'' +
            ", organic:" + organic+'\''+
            ']';
   }
 }

class rootFinal{
    private List<Fruits> fruitList;
    private List<Vegetables> vegetablesList;
    private List<Person> personList;
    //Set and get were set
}

class mainJson{
   final InputStream fileData = ..("testPVF.json");

   ObjectMapper map = new Ob..();
   rootFinal root = map.readValue(fileData,rootFinal.class);
   // I can access each class with 
   System.out.printl(root.getHeaderList.get(0));
}

Это выводит ...

[Fruit{name:'avocado', organic:true}, Fruit{name:'mango', organic:true}]

Но это не такчто я хочу.

Я пытаюсь выполнить итерацию по файлу JSON или как-нибудь, если есть лучший способ проверить, существует ли массив. Добавьте к нему дополнительный объект / массив.

Если я найду Veg или Fruit, я хочу как-то добавить VegList и FruitList, как показано. Он должен игнорировать "Person": {}, поскольку он находится в символе {}.

Ответы [ 2 ]

1 голос
/ 05 ноября 2019

Если я вас правильно понимаю, вы хотите обернуть каждый узел JSON Array, используя узел JSON Object. Для этого вам не нужно использовать POJO модель, вы можете прочитать JSON полезную нагрузку как ObjectNode и использовать ее API для ее обновления.

Простой пример:

import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
import com.fasterxml.jackson.databind.node.ObjectNode;

import java.io.File;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.Map;

public class JsonObjectApp {

    public static void main(String[] args) throws Exception {
        File jsonFile = new File("./resource/test.json").getAbsoluteFile();

        ObjectMapper mapper = new ObjectMapper();
        mapper.enable(SerializationFeature.INDENT_OUTPUT);

        ObjectNode root = (ObjectNode) mapper.readTree(jsonFile);

        Map<String, JsonNode> valuesToAdd = new LinkedHashMap<>();

        // create fields iterator
        Iterator<Map.Entry<String, JsonNode>> fieldsIterator = root.fields();
        while (fieldsIterator.hasNext()) {
            Map.Entry<String, JsonNode> entry = fieldsIterator.next();

            // if entry represents array
            if (entry.getValue().isArray()) {
                // create wrapper object
                ObjectNode arrayWrapper = mapper.getNodeFactory().objectNode();
                arrayWrapper.set(entry.getKey(), root.get(entry.getKey()));

                valuesToAdd.put(entry.getKey(), arrayWrapper);

                // remove it from object.
                fieldsIterator.remove();
            }
        }

        valuesToAdd.forEach((k, v) -> root.set(k + "List", v));

        System.out.println(mapper.writeValueAsString(root));
    }
}

Вышеупомянутый код распечатывает для вашего JSON:

{
  "Person" : {
    "Info" : [ {
      "name" : "Becky",
      "age" : 14
    } ]
  },
  "FruitsList" : {
    "Fruits" : [ {
      "name" : "avocado",
      "organic" : true
    }, {
      "name" : "mango",
      "organic" : true
    } ]
  },
  "VegetablesList" : {
    "Vegetables" : [ {
      "name" : "brocoli",
      "organic" : true
    }, {
      "name" : "lettuce",
      "organic" : true
    } ]
  }
}
0 голосов
/ 05 ноября 2019

Проверьте Получить Pretty Printer

Также проверьте специальные API для Pretty Printing

Пример кода:

//This example is using Input as JSONNode
//One can serialize POJOs to JSONNode using ObjectMapper.
ObjectMapper mapper = new ObjectMapper();
mapper.writerWithDefaultPrettyPrinter().writeValueAsString(
					inputNode)
...