Converting/Deserializing 一个 JSON ArrayList 的 ArrayList 没有 Key

Converting/Deserializing a JSON with an ArrayList of ArrayList without a Key

我有一个包含多个数组的 json 文件。我不清楚如何在没有给定的情况下设置键值对。我知道 [ … ] 代表一个数组,而 { … } 代表一个对象。我查看了在线教程,但 none 找到了我的问题的答案以及我在 JSON.

中找到的内容

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

提前致谢。

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

  "5",
  "1964-07-20",
  null,
  "7",
  null,

下面是我尝试创建的两个 classes 和原始 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;
    }
}

MusicRecords.java

public class MusicRecords {

    private double retail;
    private double price;
    private double cost;
    private double fees;
    private double profit;


    public double getRetail() {
        return retail;
    }

    public void setRetail(double retail) {
        this.retail = retail;
    }

    public double getPrice() {
        return price;
    }

    public void setPrice(double price) {
        this.price = price;
    }

    public double getCost() {
        return cost;
    }

    public void setCost(double cost) {
        this.cost = cost;
    }

    public double getFees() {
        return fees;
    }

    public void setFees(double fees) {
        this.fees = fees;
    }

    public double getProfit() {
        return profit;
    }

    public void setProfit(double profit) {
        this.profit = profit;
    }
}

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

最后,这些是我为找到答案而访问但未能找到答案的网站。



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

这里的主要问题似乎在于您的 JSON 格式。它从 artistrecord 等开始很好,但随后您定义了一个 musicRecords 数组,它似乎不仅代表记录数组,还代表一些额外数据(例如日期 "1964-07-20")。

在不知道这个结构是做什么用的情况下,这些字段似乎属于根 JSON 对象中的 artistrecord 字段,它们需要某种键代表他们的目的。

然后你就可以很容易地制作一个逻辑更合理并且更容易在你的项目中使用的 POJO。


但是,如果 JSON 文件来自您无法影响的外部来源,您有两个选择:

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

这种方法可能不是最好的主意,主要是因为 POJO 不代表在您的代码中易于使用的逻辑对象,而且还因为类型安全。您必须将列表中的所有对象向上转换为 Object,这意味着在需要访问它们时再次将它们全部向下转换。这通常是不好的做法,如果 JSON 结构完全改变,这将很难调试。

使用不同的 JSON 库

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