文档章节

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

BWaylon
 BWaylon
发布于 2017/02/23 14:33
字数 424
阅读 261
收藏 1

待解析字符串

{
    "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是否还存在这个问题

 

 

 

 

 

 

© 著作权归作者所有

共有 人打赏支持
BWaylon
粉丝 0
博文 6
码字总数 1758
作品 0
高级程序员
json处理,json、object的相互转化

用 FastJson将Json转换Bean ,用Jackson或Gson将Bean 转FastJson 要求能够支持获取Object中的Object,即支持深层嵌套的Object解析,此外json、Object间的相互转换要快速。 参考:各个JSON技术...

刘阳0292
2017/07/09
0
0
[Json框架选型]Android开发中应该使用哪一种主流json框架?

前言 前段时间@寒江不钓同学针对国内Top500和Google Play Top200 Android应用做了全面的分析(具体分析报告见文末的参考资料),其中有涉及到对主流应用使用json框架Gson、FastJson、Jackson...

张明云
2016/08/08
0
0
【Java】各个JSON技术的比较

一 、各个JSON技术的简介和优劣 1. json-lib json-lib最开始的也是应用最广泛的json解析工具,json-lib 不好的地方确实是依赖于很多第三方包,包括commons-beanutils.jar,commons-collectio...

鴿神丶
2016/07/22
25
0
Google Gson的使用方法及JSON 技术对比

一 、各个JSON技术的简介和优劣 1.json-lib json-lib最开始的也是应用最广泛的json解析工具,json-lib 不好的地方确实是依赖于很多第三方包, 包括commons-beanutils.jar,commons-collectio...

hapier
2016/11/14
130
0
还原json循环引用对象的一种办法

后端数据实体都是由hibernate生成的,与浏览器客户端交互json时,采用了alibaba FastJson库。 首先要说fastJson的确为众多json类库中数一数二的,api简单易用,性能强悍,测试完整,典型的国...

Spance
2013/08/02
7.4K
8

没有更多内容

加载失败,请刷新页面

加载更多

下一页

配置Spring的注解支持

声明:本栏目所使用的素材都是凯哥学堂VIP学员所写,学员有权匿名,对文章有最终解释权;凯哥学堂旨在促进VIP学员互相学习的基础上公开笔记。 配置Spring的注解支持 以上也提到了使用注解来配...

凯哥学堂
23分钟前
0
0
关于Spring Aop存在的一点问题的思考

在本人前面的文章Spring Aop原理之切点表达式解析中讲解了Spring是如何解析切点表达式的,在分析源码的时候,出现了如下将要讲述的问题,我认为是不合理的,后来本人单纯使用aspectj进行试验...

爱宝贝丶
25分钟前
0
0
JavaScript 概述

JavaScript是面向Web的编程语言。绝大多数现代网站都使用了JavaScript,并且所有的现代Web浏览器——基于桌面系统、游戏机、平板电脑和智能手机的浏览器——均包含了JavaScript解释器。这使得...

Mr_ET
55分钟前
0
0
Java Run-Time Data Areas(Java运行时数据区/内存分配)

Java运行时数据区(内存分配) 本文转载官网 更多相关内容可查看官网 中文翻译可参考 2.5. Run-Time Data Areas The Java Virtual Machine defines various run-time data areas that are use...

lichuangnk
今天
0
0
docker learn :services docker-compose.yml

docker-compose.yml定义了服务的运行参数 version: "3" services: web: # replace username/repo:tag with your name and image details image: hub.c.163.com/dog948453219/friendlyhello d......

writeademo
今天
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部