【问题标题】:Reformat JSON arrays/object in java在 java 中重新格式化 JSON 数组/对象
【发布时间】:2019-11-01 17:11:48
【问题描述】:

我正在尝试将此 json 文件重新格式化为其他格式。我以前从未使用过杰克逊或 gson。我得到了它的想法,但我不知道如何实现它。

所以我有一个 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,但我不知道如何。

【问题讨论】:

    标签: java json jackson gson


    【解决方案1】:

    将 JSON 赋值给 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);
    

    接下来为您的fruits 对象准备包装类ListOfFruits

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

    接下来将您的 fruits 对象打包到另一个对象中:

    ListOfFruits lof = new ListOfFruits(fruits);
    

    最后生成输出 JSON:

    String newJson = gson.toJson(lof);
    

    【讨论】:

    • 我创建了我的水果和水果类。我不太清楚如何使用包装器。
    • 它显示在上面的“下一步将你的fruits对象打包到另一个”部分中。
    • 得到了 {"listofFruits":{}}。我在这里做错了。
    • 我对这个 ListOffruits 如何访问 Fruit 和 Fruits 类感到困惑。如果您能提供帮助,我将不胜感激。
    • @Woods 我为您创建了一个示例。这是一个 Maven 项目。 github.com/rajramo61/jsonwrapper
    【解决方案2】:

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

    【讨论】:

    • 不喜欢这样。它给了我一个错误。线程“主”java.lang.NoClassDefFoundError 中的异常:com/fasterxml/jackson/annotation/JsonAutoDetect
    • @Woods,你需要添加对jackson-annotations的依赖。你使用Maven 或类似的东西吗?
    • 谢谢。我已经解决了这个问题。我添加了 jar 文件。有用。谢谢!
    • 有没有办法遍历整个数组并找到水果和蔬菜等对象?我的意思是像上面那样,然后当它找到蔬菜时,会列出一份蔬菜清单。我正在尝试这个,但没有运气。
    • @Woods,与原始问题中的问题相比,这是一个新问题。如果我的回答解决了上述问题,请接受并投票。然后问另一个问题并添加指向此问题的链接。其他开发人员会更容易找到并回答它。如果您想使用JSON 有效负载,最好创建一个代表您的JSONPOJO 模型。之后,您应该能够迭代对象并在需要时过滤或更改它们。
    【解决方案3】:

    我强烈建议您阅读 Jackson 或 Gson 库的文档,因为您提到您是新手。 我为这个项目创建了一个示例 git repo。此示例使用 Jackson 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 类的详细信息。这个类将包装从 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 +
                '}';
    }
    

    }

    您可以分叉回购并在本地关闭它,它应该可以正常工作。

    【讨论】:

    • 不喜欢这样。它给了我一个错误。线程“主”java.lang.NoClassDefFoundError 中的异常:com/fasterxml/jackson/annotation/JsonAutoDetect
    • @Woods 你克隆了 repo github.com/rajramo61/jsonwrapper 并尝试过吗?这是一个有效的例子。
    • 是的。作品。非常感谢!我真的很感激!
    • 有没有办法在没有maven项目的情况下使用jar?
    • 然后你必须下载 jars 并在你的类路径中使用它们。您可以轻松设置这是您的 IDE。我为此创建了一个示例项目。如果您使用的是 IDE,那么您需要在类路径中添加 lib 目录以引用 jar。 github.com/rajramo61/json-wrapper-no-maven
    猜你喜欢
    • 2022-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-18
    • 1970-01-01
    • 1970-01-01
    • 2021-02-28
    • 1970-01-01
    相关资源
    最近更新 更多