将json转换为java pojo

时间:2018-01-09 12:32:09

标签: java json gson

尝试使用多个在线工具将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文件开头。它使用:

转换为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>

任何想法? 感谢

2 个答案:

答案 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