我是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?
答案 0 :(得分:0)
如果没有深入研究它,看起来你的JSON缺少几个"
。
例如:9011240550013130225
需要"9011240550013130225"
同样ZLocOid
缺少起始"
答案 1 :(得分:0)
问题是,在您的JSON中,circuitId
是String
。
{
"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的新手。