Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
无法使用对象集合分析JSON_Json_Gson - Fatal编程技术网

无法使用对象集合分析JSON

无法使用对象集合分析JSON,json,gson,Json,Gson,我不熟悉JSON/GSON,但不熟悉Java。。。我一直在研究,但没有找到一个明确的答案,我越来越困惑。请容忍我。可能是,我的对象模型不太正确,但请注意,如果顶级类ConvergedNetwork具有CircuitId或Circuits gson.fromJson工作正常。只有当这类人中的同住者我才得到一个空值 我有以下JSON文档target.JSON { "convergedNetwork": { "circuitId": "58/VPXX/102866/TWCS",

我不熟悉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]
我得到以下信息:

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]

您会注意到它成功地分割了circuits对象,但没有分割circuitId对象。是否因为ckt类中的一个成员也被命名为circuitId?或者我需要编写一个适配器类来帮助GSON吗?

不必过多地挖掘它,您的JSON似乎缺少几个

例如:9011240550013130225需要是9011240550013130225


另外,ZLocOid缺少一个起始

问题是在JSON中,circuitId是一个字符串

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

"circuitId": {"circuitId":"58/VPXX/102866/TWCS"},
在另一个类pks中,您只使用了一个字符串,这就是它工作的原因

将顶级课程更改为:

public class ConvergedNetwork {

     private Circuits circuits;  
     private String circuitId;
     ...
然后它会正确地映射


编辑以添加:您的@SerializedName注释也有问题。您只需要在该ckts数组的Circuit类内部。把其他的都除掉

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

我的错。兹洛科德需要。。不知怎的,我在复制/粘贴时删除了它。我在上面把它修好了。JSON文档中支持数字,甚至长。您是否将数字包装为?上面返回的是:ConvergedNetwork[circuits=circuits:Circuit[ckt[circuitId=58/YHXX/105464/TWCS,ZLocOid=9010827045013519707],ckt[circuitId=58/YHXX/105404/TWCS,ZLocOid=9011240550013130225]],circuitId=null],所以这不是问题。。。是circuitId=null不起作用,我的意思是,在原始版本中,zlocoid值没有用引号括起来。你试过用引号括起来的值吗?我知道这听起来很傻,但严格的JSON标准要求所有键和值都用引号括起来。许多解析器仍然可以工作,但这可能会导致GSON出现问题。我更改了顶级类:公共类ConvergedNetwork{@SerializedNameconvergedNetwork private Circuits;private String circuitId;…}。我仍然遇到同样的问题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]非常感谢您的帮助!!