无法使用对象集合解析JSON

时间:2014-02-27 21:48:12

标签: json gson

我是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]

你会注意到它成功地解析了电路对象而不是circuitId对象。是因为ckt类中的一个成员也被命名为circuitId?或者我是否需要编写一个Adapter类来帮助GSON?

3 个答案:

答案 0 :(得分:0)

如果没有深入研究它,看起来你的JSON缺少几个"

例如:9011240550013130225需要"9011240550013130225"

同样ZLocOid缺少起始"

答案 1 :(得分:0)

问题是,在您的JSON中,circuitIdString

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

您已经创建了一个类(CircuitId包含一个名为String的{​​{1}}字段,并且正在尝试映射到该字段。那不行。 JSON看起来像是:

circuitId

在您的其他课程("circuitId": {"circuitId":"58/VPXX/102866/TWCS"}, )中,您只是使用pks,这就是它的工作原因。

将您的顶级课程更改为:

String

然后它会正确映射。

编辑以添加:您的public class ConvergedNetwork { private Circuits circuits; private String circuitId; ... 注释也存在问题。您需要的唯一一个是@SerializedName数组的Circuit类。摆脱所有其他人。

答案 2 :(得分:0)

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