我有一个使用Camel的端点,它返回属性为JSON,但没有正确的顺序。返回类有一个超类,它返回一些控制数据,每次返回都必须存在这些数据。
public class Respuesta implements Serializable {
@SerializedName("subject")
@Expose
private String subject;
@SerializedName("action")
@Expose
private String action;
@SerializedName("status")
@Expose
private Integer status;
@SerializedName("description")
@Expose
private String description;
...getter/setter
最终的返回类继承了那一块。
public class FacturadoresListarResponse extends Respuesta implements Serializable {
@SerializedName("lst")
@Expose
private List<Facturador> listaProveedores;
public FacturadoresListarResponse(List<Facturador> listaProveedores) {
super();
this.listaProveedores = listaProveedores;
}
public FacturadoresListarResponse() {
}
public void setRespuesta(Respuesta rsp) {
super.setAction(rsp.getAction());
super.setDescription(rsp.getDescription());
super.setStatus(rsp.getStatus());
super.setSubject(rsp.getSubject());
}
getter/setter...
}
因此,Gson的Marshaller首先获取继承的类属性(lst),然后获取父类属性(主题,状态等),从而在线上提供此类结果。
{
"lst": [
{
"rut": "XXXX-X",
"rzsoc": "XXXXXXx",
"res": 1,
"ema": "a@a.cl"
}
],
"subject": "facturadores",
"action": "listar",
"status": 0,
"description": "OK"
}
我编写了一个按顺序构建数据的GSON自定义JsonSerializer,但我无法在Camel DSL语法中使用。我试过了,但没有结果:
.marshal().json(JsonLibrary.Gson,FacturadoresListarRspSerializer.class, true)
.convertBodyTo(String.class, "UTF-8")
Camel是否支持使用这些序列化程序来实现正确的顺序而无需迁移到Jackson?
注意:序列化程序的代码(FacturadoresListarRspSerializer.class)。
public class FacturadoresListarRspSerializer implements JsonSerializer<FacturadoresListarResponse> {
@Override
public JsonElement serialize(FacturadoresListarResponse src, Type typeOfSrc, JsonSerializationContext context) {
final JsonObject jsonObject = new JsonObject();
jsonObject.addProperty("subject", src.getSubject());
jsonObject.addProperty("action", src.getAction());
jsonObject.addProperty("status", src.getStatus());
jsonObject.addProperty("description", src.getDescription());
final JsonArray jsarrFacturadores = new JsonArray();
for (final Facturador fact : src.getListaProveedores()) {
JsonObject jsobFacturadores = new JsonObject();
jsobFacturadores.addProperty("rut", fact.getRutCompleto());
jsobFacturadores.addProperty("rzsoc", fact.getRazonSocial());
jsobFacturadores.addProperty("res", fact.getResolucion());
jsobFacturadores.addProperty("ema", fact.getCorreoEnvio());
jsarrFacturadores.add(jsobFacturadores);
}
jsonObject.add("lst", jsarrFacturadores);
return jsonObject;
}
}
答案 0 :(得分:1)
创建一个新的GSON实例:
Gson gson = new GsonBuilder().registerTypeAdapter(FacturadoresListarResponse.class,
new FacturadoresListarRspSerializer()).create();
通过指定先前创建的GsonDataFormat
实例来创建新的Gson
:
GsonDataFormat gsonDataFormat = new GsonDataFormat(gson, FacturadoresListarResponse.class);
使用RouteBuilder
的{{1}}方法指定以前的数据格式:
marshal(DataFormat dataFormat)