Java解析多对象JSON:使用Son解析多维JSON遇阻求解决方案
解决Gson(Son)解析多维JSON到Java类的问题
看起来你遇到的核心问题是非静态内部类导致Gson无法正确实例化嵌套对象,另外还有几个细节需要调整,我一步步帮你解决:
1. 核心问题:非静态内部类的限制
你的PA类是Preisanpassung的非静态内部类,这种类的实例化必须依赖外部Preisanpassung的对象,而Gson在解析嵌套对象时无法自动创建外部类实例,这就导致虽然没有报错,但实际无法正确解析出PA数组的内容。
解决方法很简单:把所有嵌套的实体类(PA、PA_ARTIKEL、PA_EKB)改成静态内部类,或者把它们提取成独立的顶级类。
2. 修正后的Java类示例
调整后的Preisanpassung类
import java.io.Serializable; import java.util.List; public class Preisanpassung implements Serializable { private List<PA_ARTIKEL> PA_ARTIKEL; private List<PA> PA; private List<PA_EKB> PA_EKB; // 保留无参构造函数(Gson需要它来实例化对象) public Preisanpassung() { } // 带参构造可以保留,但不是必须的 public Preisanpassung(List<PA_ARTIKEL> paartikel, List<PA> pa, List<PA_EKB> paekb) { this.PA_ARTIKEL = paartikel; this.PA = pa; this.PA_EKB = paekb; } // Getter和Setter方法(可选,但建议添加以便后续操作) public List<PA_ARTIKEL> getPA_ARTIKEL() { return PA_ARTIKEL; } public void setPA_ARTIKEL(List<PA_ARTIKEL> PA_ARTIKEL) { this.PA_ARTIKEL = PA_ARTIKEL; } public List<PA> getPA() { return PA; } public void setPA(List<PA> PA) { this.PA = PA; } public List<PA_EKB> getPA_EKB() { return PA_EKB; } public void setPA_EKB(List<PA_EKB> PA_EKB) { this.PA_EKB = PA_EKB; } // 改成静态内部类 public static class PA implements Serializable { private long PA_GUELTIG_AB; private int PA_NR; public long getPA_GUELTIG_AB() { return PA_GUELTIG_AB; } public void setPA_GUELTIG_AB(long PA_GUELTIG_AB) { this.PA_GUELTIG_AB = PA_GUELTIG_AB; } public int getPA_NR() { return PA_NR; } public void setPA_NR(int PA_NR) { this.PA_NR = PA_NR; } } // 补充PA_ARTIKEL静态内部类 public static class PA_ARTIKEL implements Serializable { private int PA_EKB; private int PA_EAN; private double PA_NVK; private int PA_NR; private double PA_AVK; private int PA_SOLLBEST; private int MENGE; private String ARTBEZ; private String REDUART; // Getter和Setter方法 public int getPA_EKB() { return PA_EKB; } public void setPA_EKB(int PA_EKB) { this.PA_EKB = PA_EKB; } public int getPA_EAN() { return PA_EAN; } public void setPA_EAN(int PA_EAN) { this.PA_EAN = PA_EAN; } public double getPA_NVK() { return PA_NVK; } public void setPA_NVK(double PA_NVK) { this.PA_NVK = PA_NVK; } public int getPA_NR() { return PA_NR; } public void setPA_NR(int PA_NR) { this.PA_NR = PA_NR; } public double getPA_AVK() { return PA_AVK; } public void setPA_AVK(double PA_AVK) { this.PA_AVK = PA_AVK; } public int getPA_SOLLBEST() { return PA_SOLLBEST; } public void setPA_SOLLBEST(int PA_SOLLBEST) { this.PA_SOLLBEST = PA_SOLLBEST; } public int getMENGE() { return MENGE; } public void setMENGE(int MENGE) { this.MENGE = MENGE; } public String getARTBEZ() { return ARTBEZ; } public void setARTBEZ(String ARTBEZ) { this.ARTBEZ = ARTBEZ; } public String getREDUART() { return REDUART; } public void setREDUART(String REDUART) { this.REDUART = REDUART; } } // 补充PA_EKB静态内部类 public static class PA_EKB implements Serializable { private int PA_NR; private String PA_EKB_BEZ; private int PA_EKB; // Getter和Setter方法 public int getPA_NR() { return PA_NR; } public void setPA_NR(int PA_NR) { this.PA_NR = PA_NR; } public String getPA_EKB_BEZ() { return PA_EKB_BEZ; } public void setPA_EKB_BEZ(String PA_EKB_BEZ) { this.PA_EKB_BEZ = PA_EKB_BEZ; } public int getPA_EKB() { return PA_EKB; } public void setPA_EKB(int PA_EKB) { this.PA_EKB = PA_EKB; } } }
3. 注意JSON的语法错误
你提供的JSON里,第二个PA_ARTIKEL的REDUART值用了中文引号„0“,这会导致JSON解析失败,需要改成英文双引号"0":
{ "Preisanpassung" : { "PA_ARTIKEL" : [ { "PA_EKB" : 0, "PA_EAN" : 0, "PA_NVK" : 0.0, "PA_NR" : 0, "PA_AVK" : 0.0, "PA_SOLLBEST" : 0, "MENGE" : 0, "ARTBEZ" : "", "REDUART" : "" }, { "PA_EKB" : 0, "PA_EAN" : 0, "PA_NVK" : 0.0, "PA_NR" : 0, "PA_AVK" : 0.0, "PA_SOLLBEST" : 0, "MENGE" : 0, "ARTBEZ" : "", "REDUART" : "0" } ], "PA" : [ { "PA_NR" : 0, "PA_GUELTIG_AB" : 0 }, { "PA_NR" : 0, "PA_GUELTIG_AB" : 0 } ], "PA_EKB" : [ { "PA_NR" : 0, "PA_EKB_BEZ" : "", "PA_EKB" : 0 }, { "PA_NR" : 0, "PA_EKB_BEZ" : "", "PA_EKB" : 0 } ] } }
4. 解析代码示例
用Gson(你说的Son应该是Gson的笔误)解析的代码如下:
import com.google.gson.Gson; import com.google.gson.JsonObject; import com.google.gson.JsonParser; public class JsonParserDemo { public static void main(String[] args) { String json = "你的修正后JSON字符串"; Gson gson = new Gson(); // 方式:直接提取内部的Preisanpassung对象(无需额外写包装类) JsonObject jsonObject = JsonParser.parseString(json).getAsJsonObject(); Preisanpassung result = gson.fromJson(jsonObject.get("Preisanpassung"), Preisanpassung.class); // 验证解析结果 System.out.println("PA数组大小:" + result.getPA().size()); System.out.println("第一个PA的PA_NR:" + result.getPA().get(0).getPA_NR()); } }
5. 额外建议
- 确保Gson的依赖已经正确添加到你的项目中(比如Maven/Gradle)。
- 如果字段名和JSON键有差异,可以用
@SerializedName注解明确映射,比如@SerializedName("PA_NR") private int paNr;,这样Java字段可以用驼峰命名,更符合编码规范。
内容的提问来源于stack exchange,提问作者Fabian Gr
相关产品推荐
相关产品推荐

