在java中重新格式化JSON数组/对象

在java中重新格式化JSON数组/对象,java,json,jackson,gson,Java,Json,Jackson,Gson,我正在尝试将这个json文件重新格式化为不同的格式。我以前从未用过杰克逊或格森。我有这个想法,但我不知道如何实施 所以我有一个json文件:file.json,它包含: { "Fruits": [ { "name": "avocado", "organic": true }, { "name": "mango",

我正在尝试将这个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文件中添加“列表水果”


我正在尝试使用jackson api,但我不知道如何使用。

将JSON分配给字符串变量,例如,将上述JSON分配给名为
JSON
的变量:

String json = "..." // here put your JSON text;
为对象准备类:

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

class Fruits {
    private List<Fruit> fruits;
}
Gson gson = new Gson();
Fruits fruits = gson.fromJson(json, Fruits.class);
接下来为您的
水果
对象准备包装类
listofruits

class ListOfFruits {
    private Fruits listOfFruits;

    public ListOfFruits(Fruits fruits) {
        listOfFruits = fruits;
    }
}
下一步将您的
水果
对象打包到另一个:

ListOfFruits lof = new ListOfFruits(fruits);
最后生成输出JSON:

String newJson = gson.toJson(lof);

将JSON分配给字符串变量,例如,将上述JSON分配给名为
JSON
的变量:

String json = "..." // here put your JSON text;
为对象准备类:

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

class Fruits {
    private List<Fruit> fruits;
}
Gson gson = new Gson();
Fruits fruits = gson.fromJson(json, Fruits.class);
接下来为您的
水果
对象准备包装类
listofruits

class ListOfFruits {
    private Fruits listOfFruits;

    public ListOfFruits(Fruits fruits) {
        listOfFruits = fruits;
    }
}
下一步将您的
水果
对象打包到另一个:

ListOfFruits lof = new ListOfFruits(fruits);
最后生成输出JSON:

String newJson = gson.toJson(lof);

您不需要创建
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));
    }
}

您不需要创建
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));
    }
}

我强烈建议你浏览一下杰克逊或格森图书馆的文档,因为你提到你是新来的。 我已经为这个项目创建了一个git回购示例。此示例使用Jackson API

拜访

这是水果课

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 +
            '}';
}
}

下面是最后一个JSON类的详细信息。这个类将包装从jsn文件加载的初始json

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 +
            '}';
}
public类InitialJson{
私人水果清单;
@JsonProperty(“果实”)
公共列表getFruits(){
还果;
}
公众水果(列出水果){
这个。水果=水果;
}
@凌驾
公共字符串toString(){
返回“InitialJson{”+
“水果=”+水果+
'}';
}
}


你可以在本地完成回购,它应该可以正常工作。

我强烈建议你查阅杰克逊或格森图书馆的文档,因为你提到你是新来的。 我已经为这个项目创建了一个git回购示例。此示例使用Jackson API

拜访

这是水果课

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 +
            '}';
}
}

下面是最后一个JSON类的详细信息。这个类将包装从jsn文件加载的初始json

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 +
            '}';
}
public类InitialJson{
私人水果清单;
@JsonProperty(“果实”)
公共列表getFruits(){
还果;
}
公众水果(列出水果){
这个。水果=水果;
}
@凌驾
公共字符串toString(){
返回“InitialJson{”+
“水果=”+水果+
'}';
}
}



你可以在本地完成回购并关闭它,它应该可以正常工作。

我创建了我的水果和水果类。我不太清楚如何使用包装器。它显示在上面的“下一次将您的
水果
对象打包到另一个”部分。获得{“Listofruits”:{}。我在这里做错了什么。我被这个水果列表如何访问水果和水果类所困扰。如果您能帮忙,我将不胜感激。@Woods我已经为您制作了一个样品。这是一个专业项目。我创建了我的水果和水果类。我不太清楚如何使用包装器。它显示在上面的“下一次将您的
水果
对象打包到另一个”部分。获得{“Listofruits”:{}。我在这里做错了什么。我被这个水果列表如何访问水果和水果类所困扰。如果您能帮忙,我将不胜感激。@Woods我已经为您制作了一个样品。这是一个专业项目。它不喜欢这样。它给了我一个错误。线程“main”java.lang.NoClassDefFoundError中出现异常:com/fasterxml/jackson/annotation/JsonAutoDetect@Woods,您需要将依赖项添加到。您使用的是
Maven
还是类似的工具?谢谢。我已经解决了这个问题。我添加了jar文件。它起作用了。谢谢有没有办法遍历整个数组并找到诸如水果和蔬菜之类的对象?我的意思是,就像上面所说的,当它找到蔬菜时,就会列出蔬菜的清单。“我正在尝试,但运气不好。”伍兹,这是一个新问题,与原始问题相比。如果我的回答解决了上述问题,请接受并投票。然后再问另一个问题,并添加到这个问题的链接。这将更容易找到和回答其他开发人员。如果您想使用
JSON
有效负载,最好创建一个
POJO
模型来表示您的
JSON
。在那之后,你应该能够在对象上迭代,并根据需要过滤或更改它们。它给了我一个错误。线程“main”java.lang.NoClassDefFoundError中出现异常:com/fasterxml/jackson/annotation/JsonAutoDetect@Woods,您需要将依赖项添加到。您使用的是
Maven
还是类似的工具?谢谢。我已经解决了这个问题。我添加了jar文件。它起作用了。谢谢有没有办法遍历整个数组并找到诸如水果和蔬菜之类的对象?我的意思是,就像上面所说的,当它找到蔬菜时,就会列出蔬菜的清单。“我正在尝试,但运气不好。”伍兹,这是一个新问题,与原始问题相比。如果我的回答解决了上述问题,请接受并投票。及