[英]Converting json to java pojo
尝试使用几种在线工具将JSON对象转换为java pojo,以使用GSON填充数据,但出现错误:
这是json对象的示例:
{
"ENCUESTA": {
"ALOJAMIENTO": {
"RESIDENCIA": [
{
"ID_PROVINCIA_ISLA": "ES511",
"MOVIMIENTO": [
{
"SALIDAS": 0,
"PERNOCTACIONES": 3,
"N_DIA": "08",
"ENTRADAS": 3
}
]
},
{
"MOVIMIENTO": [
{
"SALIDAS": 0,
"PERNOCTACIONES": 3,
"N_DIA": "06",
"ENTRADAS": 3
}
],
"ID_PAIS": "CHN"
}
]
},
"CABECERA": {
"FECHA_REFERENCIA": {
"MES": 11,
"ANYO": 2017
},
"NOMBRE_ESTABLECIMIENTO": "UNKNOWN"
}
}
}
RESIDENCIA可以有两个选项(在xsd中为xs:choice),因此您可以:
MOVIMIENTO, ID_PROVINCIA_ISLA
要么
MOVIMIENTO, ID_PAIS
生成POJO时,仅获得其中一个,具体取决于对象中的第一个:
public class RESIDENCIA
{
private MOVIMIENTO[] MOVIMIENTO;
private String ID_PROVINCIA_ISLA;
}
ID_PAIS不存在
public class MOVIMIENTO
{
private String PERNOCTACIONES;
private String N_DIA;
private String SALIDAS;
private String ENTRADAS;
}
我最初的解决方案是添加ID_PAIS,但GSON抱怨.....
public class RESIDENCIA {
private MOVIMIENTO[] MOVIMIENTO;
private String ID_PAIS;
private String ID_PROVINCIA_ISLA;
}
错误:java.lang.IllegalStateException:应为BEGIN_ARRAY,但在路径$ .ENCUESTA.ALOJAMIENTO.RESIDENCIA [BEGIN_OBJECT] [16] .MOVIMIENTO
我的过程从xml文件开始。 使用以下命令将其转换为json:
JSONObject xmlJSONObj = XML.toJSONObject(xmlString);
更新1
<xs:element name="RESIDENCIA" id="ID_PAIS" maxOccurs="unbounded">
<xs:complexType>
<xs:sequence>
<xs:choice>
<xs:element name="ID_PAIS">
<xs:annotation>
<xs:documentation>Codificación A3 de la ISO eliminando
España
</xs:documentation>
</xs:annotation>
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:length value="3" />
</xs:restriction>
</xs:simpleType>
</xs:element>
<xs:element name="ID_PROVINCIA_ISLA">
<xs:annotation>
<xs:documentation>Codificación según ANEXO 4
</xs:documentation>
</xs:annotation>
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:length value="5" />
</xs:restriction>
</xs:simpleType>
</xs:element>
</xs:choice>
<xs:element name="MOVIMIENTO" maxOccurs="31">
<xs:complexType>
<xs:sequence>
<xs:element name="N_DIA" type="N_DIAType" />
<xs:element name="ENTRADAS">
<xs:simpleType>
<xs:restriction base="xs:unsignedLong">
<xs:totalDigits value="4" />
</xs:restriction>
</xs:simpleType>
</xs:element>
<xs:element name="SALIDAS">
<xs:simpleType>
<xs:restriction base="xs:unsignedLong">
<xs:totalDigits value="4" />
</xs:restriction>
</xs:simpleType>
</xs:element>
<xs:element name="PERNOCTACIONES">
<xs:simpleType>
<xs:restriction base="xs:unsignedLong">
<xs:totalDigits value="4" />
</xs:restriction>
</xs:simpleType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
任何想法?? 谢谢
预期为BEGIN_ARRAY,但为BEGIN_OBJECT
建议将要解析的数据是JSON对象(在JSON中的{}中括起来),但是根据您定义的RESIDENCIA类,您希望MOVIMIENTO是RESIDENCIA对象内的数组。
验证是否为所有与MOVIMIENTO相关的数据实例统一创建了您要解析的JSON字符串。
路径$ .ENCUESTA.ALOJAMIENTO.RESIDENCIA [16] .MOVIMIENTO
建议所讨论的RESIDENCIA对象位于索引16。
试试这个
Gson gson = new GsonBuilder().registerTypeAdapter(SampleObject.class, new SampleDeserializer()).create();
@Test
public void createGson() {
String demoStr = "{\n" +
" \"ENCUESTA\": {\n" +
" \"ALOJAMIENTO\": {\n" +
" \"RESIDENCIA\": [\n" +
" {\n" +
" \"ID_PROVINCIA_ISLA\": \"ES511\",\n" +
" \"MOVIMIENTO\": [\n" +
" {\n" +
" \"SALIDAS\": 0,\n" +
" \"PERNOCTACIONES\": 3,\n" +
" \"N_DIA\": \"08\",\n" +
" \"ENTRADAS\": 3\n" +
" }\n" +
" ]\n" +
" },\n" +
" {\n" +
" \"MOVIMIENTO\": [\n" +
" {\n" +
" \"SALIDAS\": 0,\n" +
" \"PERNOCTACIONES\": 3,\n" +
" \"N_DIA\": \"06\",\n" +
" \"ENTRADAS\": 3\n" +
" }\n" +
" ],\n" +
" \"ID_PAIS\": \"CHN\"\n" +
" }\n" +
" ]\n" +
" },\n" +
" \"CABECERA\": {\n" +
" \"FECHA_REFERENCIA\": {\n" +
" \"MES\": 11,\n" +
" \"ANYO\": 2017\n" +
" },\n" +
" \"NOMBRE_ESTABLECIMIENTO\": \"UNKNOWN\"\n" +
"\n" +
" }\n" +
" }\n" +
"}";
SampleObject sampleObject = gson.fromJson(demoStr, SampleObject.class);
System.out.println(sampleObject);
}
和反序列化器
public class SampleDeserializer implements JsonDeserializer<SampleObject> {
@Override
public SampleObject deserialize(JsonElement jsonElement, Type type, JsonDeserializationContext jsonDeserializationContext)
throws JsonParseException {
SampleObject sampleObject = new SampleObject();
SampleObject.Encuesta encuestaObject = new SampleObject.Encuesta();
SampleObject.ALOJAMIENTO alojamientoObject = new SampleObject.ALOJAMIENTO();
List<ResidenciaBase> baseList = new ArrayList<>();
JsonObject encuesta = jsonElement.getAsJsonObject().getAsJsonObject("ENCUESTA");
JsonObject alojamiento = encuesta.getAsJsonObject("ALOJAMIENTO");
JsonArray residencia = alojamiento.getAsJsonArray("RESIDENCIA");
for (JsonElement element : residencia) {
if (element.getAsJsonObject().has("ID_PROVINCIA_ISLA")) {
ResidenciaProv prov = new Gson().fromJson(element.getAsJsonObject().toString(), ResidenciaProv.class);
baseList.add(prov);
}
if (element.getAsJsonObject().has("ID_PAIS")) {
ResidenciaPais residenciaPais = new Gson().fromJson(element.getAsJsonObject().toString(), ResidenciaPais.class);
baseList.add(residenciaPais);
}
}
alojamientoObject.setResidencia(baseList);
encuestaObject.setAlojamiento(alojamientoObject);
JsonObject cabecera = encuesta.getAsJsonObject().getAsJsonObject("CABECERA");
SampleObject.Cabecera cabecera1 = new Gson().fromJson(cabecera.toString(), SampleObject.Cabecera.class);
encuestaObject.setCabecera(cabecera1);
sampleObject.setEncuesta(encuestaObject);
return sampleObject;
}
}
和所有实体定义,您可以在这里检查
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.