[英]Converting json to java pojo
Trying to convert json object to java pojo using several online tools to use GSON to populate the data and I get an error: 尝试使用几种在线工具将JSON对象转换为java pojo,以使用GSON填充数据,但出现错误:
This is a sample of json object: 这是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 can have two options (is xs:choice in xsd), so you can have: RESIDENCIA可以有两个选项(在xsd中为xs:choice),因此您可以:
MOVIMIENTO, ID_PROVINCIA_ISLA
or 要么
MOVIMIENTO, ID_PAIS
When I generate the POJOs, I get just one of them depending which is first in the object: 生成POJO时,仅获得其中一个,具体取决于对象中的第一个:
public class RESIDENCIA
{
private MOVIMIENTO[] MOVIMIENTO;
private String ID_PROVINCIA_ISLA;
}
ID_PAIS is not present ID_PAIS不存在
public class MOVIMIENTO
{
private String PERNOCTACIONES;
private String N_DIA;
private String SALIDAS;
private String ENTRADAS;
}
My initial solution is just to add ID_PAIS, but GSON complains..... 我最初的解决方案是添加ID_PAIS,但GSON抱怨.....
public class RESIDENCIA {
private MOVIMIENTO[] MOVIMIENTO;
private String ID_PAIS;
private String ID_PROVINCIA_ISLA;
}
Error: java.lang.IllegalStateException: Expected BEGIN_ARRAY but was BEGIN_OBJECT at path $.ENCUESTA.ALOJAMIENTO.RESIDENCIA[16].MOVIMIENTO 错误:java.lang.IllegalStateException:应为BEGIN_ARRAY,但在路径$ .ENCUESTA.ALOJAMIENTO.RESIDENCIA [BEGIN_OBJECT] [16] .MOVIMIENTO
My process start with an xml file. 我的过程从xml文件开始。 Its converted to json using: 使用以下命令将其转换为json:
JSONObject xmlJSONObj = XML.toJSONObject(xmlString);
UPDATE 1 更新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>
Any idea?? 任何想法?? Thanks 谢谢
Expected BEGIN_ARRAY but was BEGIN_OBJECT 预期为BEGIN_ARRAY,但为BEGIN_OBJECT
suggests that the data about to be parsed is a JSON Object (enclosed within { } braces in JSON), but as per the RESIDENCIA Class defined by you, you expect the MOVIMIENTO to be an Array within the RESIDENCIA object. 建议将要解析的数据是JSON对象(在JSON中的{}中括起来),但是根据您定义的RESIDENCIA类,您希望MOVIMIENTO是RESIDENCIA对象内的数组。
Verify that the JSON string that you are trying to parse is uniformly created for all MOVIMIENTO related data occurrences. 验证是否为所有与MOVIMIENTO相关的数据实例统一创建了您要解析的JSON字符串。
Path $.ENCUESTA.ALOJAMIENTO.RESIDENCIA[16].MOVIMIENTO 路径$ .ENCUESTA.ALOJAMIENTO.RESIDENCIA [16] .MOVIMIENTO
suggests that the RESIDENCIA object in question is at index 16. 建议所讨论的RESIDENCIA对象位于索引16。
Try this way 试试这个
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);
}
And the 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;
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.