FastJson解析复杂字符串(string转bean)

待解析字符串

{
    "BgRetUrl": "http://test1234.tunnel.qydev.com/hftgsp/notify.sp",
    "PrincipalAmt": "399.30",
    "Fee": "199.40",
    "ProId": "XM17010109AWQ",
    "SubOrdId": "950517010113253264028162508",
    "InCustId": "6000060006112192",
    "OrdDate": "20170220",
    "DivDetails": "[{\"DivCustId\":\"6000060006014887\",\"DivAcctId\":\"MDT000002\",\"DivAmt\":\"186.35\"},{\"DivCustId\":\"6000060006014887\",\"DivAcctId\":\"MDT000004\",\"DivAmt\":\"13.05\"}]",
    "MerCustId": "6000060006014887",
    "OrdId": "9510002201504707886",
    "OutCustId": "6000060006115439",
    "SubOrdDate": "20170101",
    "InterestAmt": "23.95",
    "Version": "30",
    "CmdId": "Repayment",
}

定义的bean

public class HftgRepaymentRequest {
    private String cmdId;

    private String merCustId;

    private String proId;

    private String ordId;

    private String ordDate; 

    private String subOrdId;

    private String subOrdDate; 

    private String outAcctId;
    
    private String principalAmt;

    private String interestAmt; 

    private String fee;

    private String inCustId;

    private List<HftgDivDetail> divDetails;

    private String bgRetUrl;
    
    //省略get、set
}

public class HftgDivDetail {
    @JSONField(ordinal = 1, name = "DivCustId")
    private String divCustId;

    @JSONField(ordinal = 2, name = "DivAcctId")
    private String divAcctId;
    
    @JSONField(ordinal = 3, name = "DivAmt")
    private String divAmt;
    
    //省略get、set
}

对字符串直接进行转换

HftgRepaymentRequest repayRequest = JSON.parseObject(jsonStr, HftgRepaymentRequest.class);

结果报错,错误如下:

com.alibaba.fastjson.JSONException: syntax error, expect {, actual string, pos 312
	at com.alibaba.fastjson.parser.deserializer.JavaBeanDeserializer.deserialze(JavaBeanDeserializer.java:343)
	at com.alibaba.fastjson.parser.deserializer.JavaBeanDeserializer.parseRest(JavaBeanDeserializer.java:832)
	at com.alibaba.fastjson.parser.deserializer.FastjsonASMDeserializer_1_HftgDivDetail.deserialze(Unknown Source)
	at com.alibaba.fastjson.parser.deserializer.JavaBeanDeserializer.deserialze(JavaBeanDeserializer.java:185)
	at com.alibaba.fastjson.parser.deserializer.ArrayListTypeFieldDeserializer.parseArray(ArrayListTypeFieldDeserializer.java:165)
	at com.alibaba.fastjson.parser.deserializer.ArrayListTypeFieldDeserializer.parseField(ArrayListTypeFieldDeserializer.java:53)
	at com.alibaba.fastjson.parser.deserializer.JavaBeanDeserializer.parseField(JavaBeanDeserializer.java:689)
	at com.alibaba.fastjson.parser.deserializer.JavaBeanDeserializer.deserialze(JavaBeanDeserializer.java:570)
	at com.alibaba.fastjson.parser.deserializer.JavaBeanDeserializer.parseRest(JavaBeanDeserializer.java:832)
	at com.alibaba.fastjson.parser.deserializer.FastjsonASMDeserializer_2_HftgRepaymentRequest.deserialze(Unknown Source)
	at com.alibaba.fastjson.parser.deserializer.JavaBeanDeserializer.deserialze(JavaBeanDeserializer.java:185)
	at com.alibaba.fastjson.parser.DefaultJSONParser.parseObject(DefaultJSONParser.java:621)
	at com.alibaba.fastjson.JSON.parseObject(JSON.java:339)

查询原因发现是HftgRepaymentRequest 当中存在list对象,当bean中存在list、map、set等复杂对象时fastjson直接解析会报错,无法识别其中的“[”。

【解决方法】

既然直接解析不行,就迂回处理一下,将bean中的list对象单独解析,然后再赋值,代码如下:

            JSONObject object = JSON.parseObject(jsonStr);
            JSONArray divDetailsArray = object.getJSONArray("DivDetails");
            
            List<HftgDivDetail> divDetailList = Lists.newArrayList();
            if(null != divDetailsArray){
                divDetailList  = JSON.parseArray(divDetailsArray.toJSONString(), HftgDivDetail.class);
            }
            
            object.remove("DivDetails");
            HftgRepaymentRequest repaymentRequest = JSON.parseObject(object.toJSONString(), HftgRepaymentRequest.class);
            repaymentRequest.setDivDetails(divDetailList);

这样就可以实现想要的复杂字符串转对象,缺点是如果对象中多个类似的集合在,每个都单独解析再赋值会比较烦。

【注】项目中使用的是fastjson-1.2.21版本,没有测试最新版本的fastjson是否还存在这个问题

 

 

 

 

 

 

转载于:https://my.oschina.net/bwaylon/blog/844662

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值