尝试使用多个在线工具将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可以有两个选项(xs:xsd中的选项),所以你可以拥有:
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 [16] .MOVIMIENTO
的路径为BEGIN_OBJECT我的进程以xml文件开头。它使用:
转换为jsonJSONObject 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>
任何想法? 感谢
答案 0 :(得分:0)
预计BEGIN_ARRAY但是BEGIN_OBJECT
建议要解析的数据是JSON对象(用JSON中的{}括号括起来),但是根据你定义的RESIDENCIA类,你希望MOVIMIENTO是RESIDENCIA对象中的一个数组。
验证您尝试解析的JSON字符串是否为所有MOVIMIENTO相关数据事件统一创建。
Path $ .ENCUESTA.ALOJAMIENTO.RESIDENCIA [16] .MOVIMIENTO
表明有问题的RESIDENCIA对象位于索引16处。
答案 1 :(得分:0)
试试这种方式
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);
}
Deserializer
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;
}
}
所有实体定义,您都可以查看here