You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.12 04:20:12