Java 使用ArrayList或ArrayList(不带键)转换/反序列化JSON
我有一个包含多个数组的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个无键属性),它将始终是相同的。这个值是唯一改变的 提前谢谢 没有与以下属性关联的键值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”,
"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