文档章节

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

BWaylon
 BWaylon
发布于 2017/02/23 14:33
字数 424
阅读 327
收藏 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

没有更多内容

加载失败,请刷新页面

加载更多

崩溃bug日志总结1

目录介绍 1.1 java.lang.UnsatisfiedLinkError找不到so库异常 1.2 java.lang.IllegalStateException非法状态异常 1.3 android.content.res.Resources$NotFoundException 1.4 java.lang.Ille......

潇湘剑雨
55分钟前
0
0
学习大数据为什么要先学Java?

计算机编程语言有很多,目前用的多一点的就是Java,C++,Python等等。目前大多数学习大数据的人都是选择学习Java,那Java到底好在哪呢?为什么学大数据之前要先学Java呢?我们今天就来分析一...

董黎明
今天
1
0
php删除服务器所有session

php删除服务器所有session踢掉所有在线用户linux 注意:如果要删除服务器上所有session,重启php服务是解决不了问题的,php的session是持久化的。 有效解决办法: 删除 /tmp 下的所有文件(默...

妖尾巴
今天
0
0
Ubuntu18.04 安装最新版WPS

1.手动卸载libreoffice:sudo apt-get remove --purge libreoffice* 2.官网下载WPS和字体: WPS:http://wps-community.org/download.html 字体:http://wps-community.org/download.html?vl......

AI_SKI
今天
4
0
数据结构(算法)-图(深度优先搜索 DFS)

#include <iostream>using namespace std;#define MaxVex 30typedef char VertexType;typedef struct vexNode adjList[MaxVex];struct edgeNode{int adjvex;//邻接点......

ashuo
今天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部