解析对复杂 DTO 的响应?
Parse response to complex DTO?
这简直让我头晕目眩,因为我找不到解决这个问题的好方法:
我正在处理像这样的复杂响应。
{
"etiquetaPago": "1001462713 ",
"codigoAdhesion": "01",
"vencimientos": null,
"empresa": {
"codigo": "911",
"descripcion": "Universidad Arg. John F. Kennedy",
"rubro": {
"codigo": "14",
"descripcion": "Instituciones Educativas"
},
"manejaBaseDeudas": false,
"manejaMultiplesConceptos": false,
"manejaIngresoReferencia": true,
"manejaIngresoImportes": false,
"habilitado": true,
"importesFijos": null,
"importesPosibles": null
},
"concepto": [
{
"codigoConcepto": "001",
"descripcionConcepto": "Cuota",
"tipoPago": "PAGO_IGUAL",
"manejaIngresoReferencia": true,
"textoIngresoReferencia": true,
"validaLongitudReferencia": true,
"longitudMinimaTextoReferencia": 2,
"longitudMaximaTextoReferencia": 2,
"manejaIngresoImportes": false,
"manejaRango": true,
"importeFijo": 100.0,
"importeMinimo": 100.0,
"importeMaximo": 100.0
}
]
}
我必须像这样将它解析为 DTO class:
public class ConsultaPagosAgendaResponseDTO {
List<PagoAgendaDTO> pagosAgendas;
}
里面有:
public class PagoAgendaDTO {
private String etiquetaPago;
private String codigoAdhesion;
private EmpresaDTO empresa;
private List<VencimientoDTO> vencimientos;
private List<ConceptoDTO> conceptos;
}
public class EmpresaDTO {
private String codigo;
private String descripcion;
private RubroDTO rubro;
private boolean manejaBaseDeudas;
private boolean manejaMultiplesConceptos;
private boolean manejaIngresoReferencia;
private boolean manejaIngresoImportes;
private boolean habilitado;
}
然后继续..
简单的方法是手工制作,用 foreach 迭代,但我想使用其他类型的方法,但不知道有什么,你会推荐什么?
在这种情况下,DTO 可能与响应完全相同,但它们也可能不同。
谢谢
这实际上取决于您将如何使用它以及您将要实现什么。
如果你只是想从那里获取一些值,你可以将它反序列化为一棵树。
我相信,你正在使用杰克逊。所以你可以使用 ObjectMapper#readTree
并且你不需要有那么多的DTO。但作为一个缺点,使用响应操作会不太方便。
换句话说,如果您不需要响应中的所有值,您可以使用仅包含已用字段的 DTO,并使用 @JsonIgnoreProperties(ignoreUnknown = true)
忽略其他字段。
如果你需要所有的数据,比如在上面做一些业务登录,那么有这样的 DTO 会更方便,即使编写它们似乎是样板文件。
这简直让我头晕目眩,因为我找不到解决这个问题的好方法: 我正在处理像这样的复杂响应。
{
"etiquetaPago": "1001462713 ",
"codigoAdhesion": "01",
"vencimientos": null,
"empresa": {
"codigo": "911",
"descripcion": "Universidad Arg. John F. Kennedy",
"rubro": {
"codigo": "14",
"descripcion": "Instituciones Educativas"
},
"manejaBaseDeudas": false,
"manejaMultiplesConceptos": false,
"manejaIngresoReferencia": true,
"manejaIngresoImportes": false,
"habilitado": true,
"importesFijos": null,
"importesPosibles": null
},
"concepto": [
{
"codigoConcepto": "001",
"descripcionConcepto": "Cuota",
"tipoPago": "PAGO_IGUAL",
"manejaIngresoReferencia": true,
"textoIngresoReferencia": true,
"validaLongitudReferencia": true,
"longitudMinimaTextoReferencia": 2,
"longitudMaximaTextoReferencia": 2,
"manejaIngresoImportes": false,
"manejaRango": true,
"importeFijo": 100.0,
"importeMinimo": 100.0,
"importeMaximo": 100.0
}
]
}
我必须像这样将它解析为 DTO class:
public class ConsultaPagosAgendaResponseDTO {
List<PagoAgendaDTO> pagosAgendas;
}
里面有:
public class PagoAgendaDTO {
private String etiquetaPago;
private String codigoAdhesion;
private EmpresaDTO empresa;
private List<VencimientoDTO> vencimientos;
private List<ConceptoDTO> conceptos;
}
public class EmpresaDTO {
private String codigo;
private String descripcion;
private RubroDTO rubro;
private boolean manejaBaseDeudas;
private boolean manejaMultiplesConceptos;
private boolean manejaIngresoReferencia;
private boolean manejaIngresoImportes;
private boolean habilitado;
}
然后继续..
简单的方法是手工制作,用 foreach 迭代,但我想使用其他类型的方法,但不知道有什么,你会推荐什么?
在这种情况下,DTO 可能与响应完全相同,但它们也可能不同。
谢谢
这实际上取决于您将如何使用它以及您将要实现什么。
如果你只是想从那里获取一些值,你可以将它反序列化为一棵树。
我相信,你正在使用杰克逊。所以你可以使用 ObjectMapper#readTree
并且你不需要有那么多的DTO。但作为一个缺点,使用响应操作会不太方便。
换句话说,如果您不需要响应中的所有值,您可以使用仅包含已用字段的 DTO,并使用 @JsonIgnoreProperties(ignoreUnknown = true)
忽略其他字段。
如果你需要所有的数据,比如在上面做一些业务登录,那么有这样的 DTO 会更方便,即使编写它们似乎是样板文件。