Java 使用ArrayList或ArrayList(不带键)转换/反序列化JSON

Java 使用ArrayList或ArrayList(不带键)转换/反序列化JSON,java,arrays,json,json-deserialization,pojo,Java,Arrays,Json,Json Deserialization,Pojo,我有一个包含多个数组的json文件。我不清楚在没有给出键值对的情况下如何设置键值对。我知道[…]表示数组,{…}表示对象。我在网上看了一些教程,但没有一个能回答我的问题,也没有一个能回答我在这个JSON中的发现 问题是: 我正在尝试将JSON中的每个属性转换为POJO/数据类型。下面的arraylist中有一些属性没有键值对。“5”、“1964-07-20”、null、“7”、null,在此arraylist中有具有键值对的属性。{“retail”:“7.05”,“price”:“12.07”,

我有一个包含多个数组的json文件。我不清楚在没有给出键值对的情况下如何设置键值对。我知道[…]表示数组,{…}表示对象。我在网上看了一些教程,但没有一个能回答我的问题,也没有一个能回答我在这个JSON中的发现

问题是: 我正在尝试将JSON中的每个属性转换为POJO/数据类型。下面的arraylist中有一些属性没有键值对。“5”、“1964-07-20”、null、“7”、null,在此arraylist中有具有键值对的属性。{“retail”:“7.05”,“price”:“12.07”,“cost”:“3.01”,“fees”:“1.75”,“profit”:“5.85”}如何创建一个类来处理每个属性并将其存储到数据类型。 它将在开始时有相同的字段(5个无键属性),它将始终是相同的。这个值是唯一改变的

提前谢谢

没有与以下属性关联的键值

  "5",
  "1964-07-20",
  null,
  "7",
  null,
下面是我试图创建的两个类和原始JSON文件。也是一个自动生成的JSON

Music.java

import java.util.ArrayList;

public class Music {
    private String artist;
    private String record;
    ArrayList<MusicRecords> musicRecords = new ArrayList<MusicRecords>();


    public String getArtist() {
        return artist;
    }

    public String getRecord() {
        return record;
    }

    public ArrayList<MusicRecords> getMusicRecords() {
        return musicRecords;
    }

    public void setArtist(String artist) {
        this.artist = artist;
    }

    public void setRecord(String record) {
        this.record = record;
    }

    public void setMusicRecords(ArrayList<MusicRecords> musicRecords) {
        this.musicRecords = musicRecords;
    }
}

Music.json

{
  "artist": "Beatles",
  "record": "Something New",
  "musicRecords": [
    [
      "5",
      "1964-07-20",
      null,
      "7",
      null,
      {
        "retail": "7.05",
        "price": "12.07",
        "cost": "3.01",
        "fees": "1.75",
        "profit": "5.85"
      },
      {
        "retail": "8.05",
        "price": "12.07",
        "cost": "5.01",
        "fees": "3.75",
        "profit": "7.85"
      },
      {
        "retail": "5.05",
        "price": "10.07",
        "cost": "2.01",
        "fees": "1.75",
        "profit": "4.85"
      },
      {
        "retail": "9.05",
        "price": "14.07",
        "cost": "5.01",
        "fees": "3.75",
        "profit": "7.85"
      }
    ],
    [
      null,
      "1967-05-17",
      "4",
      null,
      2,
      {
        "retail": "7.05",
        "price": "12.07",
        "cost": "3.01",
        "fees": "1.75",
        "profit": "5.85"
      },
      {
        "retail": "8.05",
        "price": "12.07",
        "cost": "5.01",
        "fees": "3.75",
        "profit": "7.85"
      },
      {
        "retail": "5.05",
        "price": "10.07",
        "cost": "2.01",
        "fees": "1.75",
        "profit": "4.85"
      },
      {
        "retail": "9.05",
        "price": "14.07",
        "cost": "5.01",
        "fees": "3.75",
        "profit": "7.85"
      }
    ]
  ]
}
下面是自动生成的JSON格式化程序。它不会为下面显示的内部数组创建键值对。它创建类型为Object的ArrayList

        "retail": "8.05",
        "price": "12.07",
        "cost": "5.01",
        "fees": "3.75",
        "profit": "7.85"

JSON自动格式化文件

public class Application {
  private String artist;
  private String record;
  ArrayList<Object> musicRecords = new ArrayList<Object>();


 // Getter Methods 

  public String getArtist() {
    return artist;
  }

  public String getRecord() {
    return record;
  }

 // Setter Methods 

  public void setArtist( String artist ) {
    this.artist = artist;
  }

  public void setRecord( String record ) {
    this.record = record;
  }
}


这里的主要问题似乎在于JSON格式。它从艺术家、唱片等开始就很好,但是你已经定义了一个音乐记录数组,它似乎不仅代表了一个记录数组,而且还代表了一些额外的数据(例如日期
“1964-07-20”

在不知道此结构的用途的情况下,这些字段似乎属于根JSON对象中的
artist
record
字段,它们需要某种键来表示其用途

然后,您可以轻松地创建一个POJO,使其更具逻辑意义,并且更易于在项目中使用


但是,如果JSON文件来自您不受影响的外部源,则有两种选择:

使用您发布的JSON自动格式化文件

这种方法可能不是最好的方法,主要是因为POJO没有表示一个易于在代码中使用的逻辑对象,但也是因为类型安全。您必须将列表中的所有对象向上转换为
Object
,这意味着在需要访问它们时再次向下转换它们。这通常是一种不好的做法,如果JSON结构发生了变化,那么调试将非常困难

使用不同的JSON库


最好的解决方案是使用JSON库,它允许您一步一步地读取JSON文件,然后映射到您熟悉的POJO,并更好地表示您的用例。然而,据我所知,GSON是一个直接反序列化库,因此无法提供映射到其他格式所需的微调。

欢迎使用堆栈溢出!您是否有代码的特定部分不工作或引发异常?我正努力想知道你真正的问题来自哪里!感谢您的欢迎@Henry Twist。我是尝试将JSON中的每个属性转换为POJO。下面的arraylist中有一些属性没有键值对。“5”、“1964-07-20”、null、“7”、null,在此arraylist中有具有键值对的属性。{“retail”:“7.05”,“price”:“12.07”,“cost”:“3.01”,“fees”:“1.75”,“profit”:“5.85”}如何创建一个类来处理两个属性并将每个属性存储到一个数据类型。哦,我明白了!JSON响应是否总是保证在开始时包含这些字段?还有,您想使用什么JSON库?它在开始时会有这些字段,它总是一样的。这个值是唯一改变的。我用的是GSON。这是针对JAva云应用程序的。内部数组的数量可能会有所不同,但这不会有什么区别。{“零售”:“7.05”,“价格”:“12.07”,“成本”:“3.01”,“费用”:“1.75”,“利润”:“5.85”},{“零售”:“8.05”,“价格”:“12.07”,“成本”:“5.01”,“费用”:“3.75”,“利润”:“7.85”},请不要在评论中提供任何进一步的信息。始终编辑并更新您的问题。理解问题所需的一切都应该放在问题中。只是想补充一点,添加“为什么”可能会有用,因为您觉得“阅读似乎不太合乎逻辑,也不太安全”。我知道你为什么要提到这一点(可能与数组中现在有多种值类型的事实有关),但我做了一个有根据的猜测。你是对的,编辑了我的答案,希望能提供更好的解释。你好@HenryTwist,谢谢你的回复。我同意。我最后要求创建JSON的小组相应地更新它。
public class Application {
  private String artist;
  private String record;
  ArrayList<Object> musicRecords = new ArrayList<Object>();


 // Getter Methods 

  public String getArtist() {
    return artist;
  }

  public String getRecord() {
    return record;
  }

 // Setter Methods 

  public void setArtist( String artist ) {
    this.artist = artist;
  }

  public void setRecord( String record ) {
    this.record = record;
  }
}

https://stackoverflow.com/questions/2591098/how-to-parse-json-in-java
https://stackoverflow.com/questions/37816746/reading-a-json-file-in-java
http://theoryapp.com/parse-json-in-java/
https://mkyong.com/java/how-to-parse-json-with-gson/
http://tutorials.jenkov.com/java-json/gson.html#parsing-json-into-java-objects

I also used these auto generators below:
https://www.freecodeformat.com/json2pojo.php
http://pojo.sodhanalibrary.com/
http://www.jsonschema2pojo.org/
https://www.site24x7.com/tools/json-to-java.html