【发布时间】:2021-12-22 10:57:20
【问题描述】:
我需要处理一个 JSON - 它有重复的组 我需要将其转换为固定长度记录
{
"blockType" : "BL-H ",
"blockTypeLength" : "00000031",
"blockId" : "S62951156229900",
"totalNoOfTX" : "001",
"msgblockType" : "TX-S ",
"messageLength" : "00000728",
"noa":[
{
"title":"Behin",
"artist":"LIMP ",
"itunes_link":"http:behind"
},
{
"title":"Alone",
"artist":"ALYSS",
"itunes_link":"http:clk.doubler.com"
}
]
}
应该转换成BehinLIMP http:behindAloneALYSShttp:clk.doubler.com
我可以在请求中包含一对多这样的组
我尝试过的-
DataFormat bindy = new BindyFixedLengthDataFormat(myModel.class);
from("direct:testUnmarshall")
.log("${body}")
//.unmarshal().json(JsonLibrary.Jackson, BillingBookingRequest[].class)
.inputType(BillingBookingRequest.class)
.process(new Processor() {
@Override
public void process(Exchange exchange) throws Exception {
try {
BillingBookingRequest responseBody = exchange.getMessage().getBody(BillingBookingRequest.class);
ZvkkRequest requestBody = new ZvkkRequest();
requestBody.setBlockType(responseBody.getBlockType());
requestBody.setBlockTypeLength(responseBody.getBlockTypeLength());
requestBody.setBlockId(responseBody.getBlockId());
requestBody.setTotalNoOfTX(responseBody.getTotalNoOfTX());
requestBody.setMsgblockType(responseBody.getMsgblockType());
requestBody.setMessageLength(responseBody.getMessageLength());
List<DAO> noaList = responseBody.getNoa();
List<DAOFix> repGrp = new ArrayList<>();
for (DAO noa:
noaList) {
DAOFix obj = new DAOFix();
obj.setArtist(noa.getArtist());obj.setTitle(noa.getTitle());obj.setItunes_link(noa.getItunes_link());
repGrp.add(obj);
}
requestBody.setRepeatingGrp(repGrp);
exchange.getOut().setBody(requestBody);
} catch (Exception exception){
System.out.println("EXCEPTION HERE :: "+exception.getMessage());
exception.printStackTrace();
}
}
})
.log("Before marshal ....... ${body}")
.marshal(bindy)
.log("After marshal ....... ${body}")
.to("{{file.path}}fileName=check.dat")
.end();
java.lang.ClassCastException: java.lang.Class cannot be cast to java.lang.reflect.ParameterizedType
also observed - org.apache.camel.NoTypeConversionAvailableException: No type converter available to convert from type: myFixedLengthRequestModel to the required type: java.io.InputStream with value myFixedLengthRequestModel[with all the values]
我已经使用了相应的模型来保存 json 的值以及 @FixedLengthRecord 需要帮助来理解和解决这个问题。
public class ZvkkRequest {
@DataField(pos = 1, length=5, align = "L", paddingChar=' ')
private String blockType;
@DataField(pos = 2, length=8, align = "R", paddingChar='0')
private int blockTypeLength;
@DataField(pos = 3, length=15, align = "L", paddingChar=' ')
private String blockId;
@DataField(pos = 4, length=3, align = "R", paddingChar='0')
private int totalNoOfTX;
@DataField(pos = 5, length=5, align = "L", paddingChar=' ')
private String msgblockType;
@DataField(pos = 6, length=8, align = "R", paddingChar='0')
private int messageLength;
@OneToMany(mappedTo = "classpath.DAOFix")
private List<DAOFix> repeatingGrp;
}
class DAOFix {
@DataField(pos = 7, length=5, align = "R", paddingChar=' ')
private String title;
@DataField(pos = 8, length=5, align = "R", paddingChar=' ')
private String artist;
@DataField(pos = 9, length=5, align = "R", paddingChar=' ')
private String itunes_link;
}
【问题讨论】:
-
是否可以在fixedLengthformat中添加多个重复字段?
-
我没有看到您在任何时候将 json 解组为 pojo 您是否在其他路线上这样做?查看 bindy annotated(?)
myFixedLengthRequestModel类也可以帮助解决问题。 -
嗨@Pasi Österman @DataField(pos = 6, length=8, align = "R", paddingChar='0') private int messageLength; @OneToMany(mappedTo = "com.db.gtbb.adapter.zvkk.model.Noa") @DataField(pos = 7, length=5, align = "L", paddingChar=' ') private List
noaLength; -
嗨@Pasi Österman - 我尝试了以下两种方法 - 1. 添加@OneToMany 标记后,我得到java.lang.ClassCastException:java.lang.Class 无法转换为java.lang。 reflect.ParameterizedType
@DataField(pos = 6, length=8, align = "R", paddingChar='0') private int messageLength; @OneToMany(mappedTo = "com.model.Noa") @DataField(pos = 7, length=5, align = "L", paddingChar=' ') private List<Noa> noaLength; -
2.通过这种方法,我可以将数据转换为固定长度,但我只能存储一个对象
@DataField(pos = 7, length=5, align = "L", paddingChar=' ') private String title; @DataField(pos = 8, length=5, align = "L", paddingChar=' ') private String artist; @DataField(pos = 9, length=20, align = "L", paddingChar=' ') private String itunes_link;
标签: java apache-camel marshalling