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