Переформатировать массивы / объект JSON в Java - PullRequest
0 голосов
/ 01 ноября 2019

Я пытаюсь переформатировать этот файл json в другой формат. Я никогда раньше не использовал Джексона или Гсона. Я понял это, но не знаю, как это реализовать.

Итак, у меня есть файл json: file.json, который содержит:

 { 
     "Fruits": [
           {
             "name": "avocado",
             "organic": true
           },
           {
              "name": "mango",
              "organic": true
           }
    ]
}

Что я хочу получить в этом формате:

    { 
       "List Fruits":{
        "Fruits": [
           {
             "name": "avocado",
             "organic": true
           },
           {
              "name": "mango",
              "organic": true
           }
        ]
      }  
   }

Каким-то образомдобавьте «Список фруктов» в файл json.

Я пытаюсь использовать API Джексона, но не знаю как.

Ответы [ 3 ]

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

Вам не нужно создавать POJO модель для чтения и обновления JSON. Используя Jackson, вы можете прочитать всю полезную нагрузку JSON до JsonNode, создать Map с требуемым ключом и сериализовать до JSON назад. См. Пример ниже:

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

import java.io.File;
import java.util.Collections;
import java.util.Map;

public class JsonApp {

    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);

        JsonNode root = mapper.readTree(jsonFile);
        Map<String, JsonNode> output = Collections.singletonMap("List Fruits", root);

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

Над отпечатками кода:

{
  "List Fruits" : {
    "Fruits" : [ {
      "name" : "avocado",
      "organic" : true
    }, {
      "name" : "mango",
      "organic" : true
    } ]
  }
}
1 голос
/ 01 ноября 2019

Назначьте переменную JSON to String, например, назначьте вышеуказанный JSON переменной json:

String json = "..." // here put your JSON text;

Подготовьте классы для ваших объектов:

class Fruit {
    private String name;
    private boolean organic;
}

class Fruits {
    private List<Fruit> fruits;
}

, затем используйте Gsonчтобы преобразовать JSON в ваши объекты:

Gson gson = new Gson();
Fruits fruits = gson.fromJson(json, Fruits.class);

Далее подготовьте класс-обертку ListOfFruits для вашего fruits объекта:

class ListOfFruits {
    private Fruits listOfFruits;

    public ListOfFruits(Fruits fruits) {
        listOfFruits = fruits;
    }
}

Затем упакуйте ваш fruits объект в другой:

ListOfFruits lof = new ListOfFruits(fruits);

И, наконец, сгенерировать обратно JSON:

String newJson = gson.toJson(lof);
0 голосов
/ 02 ноября 2019

Я бы настоятельно рекомендовал ознакомиться с документацией библиотек Джексона или Гсона, поскольку вы упомянули, что вы новичок. Я создал образец git-репо для этого предмета. В этом примере используется API Джексона.

Посетите https://github.com/rajramo61/jsonwrapper

final InputStream fileData = ClassLoader.getSystemResourceAsStream("file.json");
    ObjectMapper mapper = new ObjectMapper();
    InitialJson initialJson = mapper.readValue(fileData, InitialJson.class);
    System.out.println(mapper.writeValueAsString(initialJson));
    final FinalJson finalJson = new FinalJson();
    finalJson.setListOfFruits(initialJson);
    System.out.println(mapper.writeValueAsString(finalJson));

Это класс Fruit.

public class Fruit {
private String name;
private boolean organic;

public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
}

public boolean getOrganic() {
    return organic;
}

public void setOrganic(boolean organic) {
    this.organic = organic;
}

@Override
public String toString() {
    return "Fruit{" +
            "name='" + name + '\'' +
            ", organic=" + organic +
            '}';
}

}

Вот FinalJsonклассная деталь. Этот класс будет переносить исходный json, загруженный из файла jsn.

public class FinalJson {
private InitialJson listOfFruits;

@JsonProperty("List Fruits")
public InitialJson getListOfFruits() {
    return listOfFruits;
}

public void setListOfFruits(InitialJson listOfFruits) {
    this.listOfFruits = listOfFruits;
}

}

Здесь приведена подробная информация о классе InitialJson. Этот класс извлекает данные из файла json.

public class InitialJson {
private List<Fruit> fruits;

@JsonProperty("Fruits")
public List<Fruit> getFruits() {
    return fruits;
}

public void setFruits(List<Fruit> fruits) {
    this.fruits = fruits;
}

@Override
public String toString() {
    return "InitialJson{" +
            "fruits=" + fruits +
            '}';
}

}

Вы можете разветвить репо и закрыть его локально, и оно должно работать нормально.

...