【问题标题】:Can't parse JSON with object collections无法使用对象集合解析 JSON
【发布时间】:2014-03-08 01:11:21
【问题描述】:

我是 JSON/GSON 的新手,但不是 Java 的新手……一直在研究,但没有找到明确的答案,让自己更加困惑。请多多包涵。可能是我的对象模型不太正确,但会注意到,如果顶级类(ConvergedNetwork)具有 CircuitId 或 Circuits gson.fromJson() 工作正常。只有当这个班级的同居者我得到一个空值。

我有以下 JSON 文档 (target.json)

{
    "convergedNetwork": {
        "circuitId": "58/VPXX/102866/TWCS",
        "circuits": {
            "circuit": [
                {
                    "ZLocOid": 9010827045013519707,
                    "circuitId": "58/YHXX/105464/TWCS"
                },
                {
                    "ZLocOid": 9011240550013130225,
                    "circuitId": "58/YHXX/105404/TWCS"
                }
            ]
        }
    }
}

我的 bean 类是:

package beans;

import com.google.gson.annotations.SerializedName;

public class ConvergedNetwork {
    @SerializedName("convergedNetwork")

    private Circuits circuits;  

    private CircuitId circuitId;
    public CircuitId getCircuitId() {
        return circuitId;
    }

    public void setCircuitId(CircuitId circuitId) {
        this.circuitId = circuitId;
    }

    public Circuits getCircuits() {
        return circuits;
    }

    public void setCircuits(Circuits circuits) {
        this.circuits = circuits;
    }

    @Override
    public String toString() {
        return "ConvergedNetwork [circuits=" + circuits + ", circuitId="
                + circuitId + "]";
    }

}

package beans;

import com.google.gson.annotations.SerializedName;

public class Circuits {

        @SerializedName("circuits")
        private Circuit circuit;

        public Circuit getCircuit() {
            return circuit;
        }

        public void setCircuit(Circuit circuit) {
            this.circuit = circuit;
        }

        @Override
        public String toString() {
            return "Circuits: " +circuit.toString()+ "]";
        }


}

package beans;

import java.util.Arrays;

import com.google.gson.annotations.SerializedName;

public class Circuit {

        @SerializedName("circuit")

        private ckt[] ckts;

        public ckt[] getCkts() {
            return ckts;
        }

        public void setCkts(ckt[] ckts) {
            this.ckts = ckts;
        }

        @Override
        public String toString() {
            return "Circuit [ckts=" + Arrays.toString(ckts) + "]";

        }
        class ckt
        {
          long ZLocOid;
          String circuitId;
          public long getZLocOid() {
            return ZLocOid;
          }
            public void setZLocOid(long zLocOid) {
                ZLocOid = zLocOid;
            }
            public String getCircuitId() {
                return circuitId;
            }
            public void setCircuitId(String circuitId) {
                this.circuitId = circuitId;
            }

            @Override
            public String toString() {
                return "ckt [ circuitId=" + circuitId + ", ZLocOid=" + ZLocOid+ "]" ;
            }
        }
}


package beans;

import com.google.gson.annotations.SerializedName;

public class CircuitId {
    @SerializedName("circuitId")

    private String circuitId;

    public String getCircuitId() {
        return circuitId;
    }
    public void setCircuitId(String circuitId) {
        this.circuitId = circuitId;
    }

    @Override
    public String toString() {
        return "Circuit [circuitId=" + circuitId + "]";
    }

}

当我运行以下命令时:

Gson gson = new GsonBuilder().setPrettyPrinting().create(); 
String fileData = new String(Files.readAllBytes(Paths.get("target.json"))); ConvergedNetwork obj = gson.fromJson(fileData, ConvergedNetwork.class);
System.out.println("\n\n Obj: "+obj.getClass()+ "\n\n" + obj.toString());

我得到以下信息:

ConvergedNetwork [circuits=Circuits: Circuit [ckts=[ckt [ circuitId=58/YHXX/105464/TWCS, ZLocOid=0], ckt [ circuitId=58/YHXX/105404/TWCS, ZLocOid=9011240550013130225]]]], circuitId=null]

您会注意到它成功地解析了电路对象,但没有解析电路 ID 对象。是不是因为 ckt 类中的成员之一也被命名为 circuitId?还是我需要编写一个适配器类来帮助 GSON?

【问题讨论】:

    标签: json gson


    【解决方案1】:

    如果不深入研究,您的 JSON 似乎缺少几个 "

    例如:9011240550013130225 需要为"9011240550013130225"

    另外ZLocOid 缺少一个起始"

    【讨论】:

    • 我的错。 ZLocOid 需要“.. 我在复制/粘贴时以某种方式删除了它。我在上面修复了它。JSON 文档中支持数字,甚至是长整数。
    • 你把数字包在"'s 里了吗?
    • 以上返回:ConvergedNetwork [circuits=Circuits: Circuit [ckts=[ckt [ circuitId=58/YHXX/105464/TWCS, ZLocOid=9010827045013519707], ckt [ circuitId=58/YHXX/105404/ TWCS, ZLocOid=9011240550013130225]]]], circuitId=null] 所以这不是问题......它是 circuitId=null 不工作
    • 我的意思是在原文中 "ZLocOid"values 没有用引号括起来。您是否尝试过用引号括起来的值?我知道这听起来很傻,但严格的 JSON 标准要求所有键和值都用引号括起来。许多解析器仍然可以工作,但它可能会导致 GSON 出现问题
    【解决方案2】:

    问题在于,在您的 JSON 中,circuitIdString

    {
    "convergedNetwork": {
        "circuitId": "58/VPXX/102866/TWCS",
    ...    
    

    您创建了一个类 (CircuitId),该类包含一个名为 circuitIdString 字段,并且正在尝试映射到它。那是行不通的。 JSON 看起来像:

    "circuitId": {"circuitId":"58/VPXX/102866/TWCS"},
    

    在您的其他课程 (pks) 中,您只是使用 String,这就是它起作用的原因。

    将您的顶级课程更改为:

    public class ConvergedNetwork {
    
         private Circuits circuits;  
         private String circuitId;
         ...
    

    然后它会正确映射。

    编辑添加:您的@SerializedName 注释也有问题。您唯一需要的就是在ckts 数组的Circuit 类中。摆脱所有其他人。

    【讨论】:

    • 我像这样更改了顶级类: public class ConvergedNetwork { @SerializedName("convergedNetwork") private Circuitscircuits;私有字符串电路ID; .... } 我仍然遇到同样的问题(circuitId = null):ConvergedNetwork [circuits=Circuits: Circuit [ckts=[ckt [ circuitId=58/YHXX/105464/TWCS, ZLocOid=9010827045013519707], ckt [ circuitId= 58/YHXX/105404/TWCS, ZLocOid=9011240550013130225]]]], circuitId=null]
    • 感谢您帮助我!
    【解决方案3】:

    修复了这些问题。首先,注释是错误的。出于某种原因,我认为它们是对象类的名称而不是成员字段。打我的头。我修复的另一个问题是我缺少一个顶级容器类,因此可以解析所有对象。我创建了一个包含 ConvergedNetwork 类的“数据”类。将这一切归咎于业余错误,因为我是 GSON/JSON 新手。

    【讨论】:

      猜你喜欢
      • 2021-12-29
      • 1970-01-01
      • 2015-01-25
      • 2014-08-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多