繁体   English   中英

将JSON转换为Java Pojo

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM