json转java对象举例,Json转java对象

最近在最一个项目,项目中涉及到 json字符串 转换成 java对象,其中遇到一个问题,在这里记录一下。

首先,我是按照下面博文的方式进行转的,地址如下:

JSON字符串和java对象的互转【json-lib】

这个是上面博文中需要的jar包:要想实现JSON和java对象之间的互转,需要借助第三方jar包,这里使用json-lib这个jar包,下载地址为:https://sourceforge.net/projects/json-lib/,json-lib需要commons-beanutils-1.8.0.jar、commons-collections-3.2.1.jar、commons-lang-2.5.jar、commons-logging-1.1.1.jar、ezmorph-1.0.6.jar五个包的支持,可以自行从网上下载,这里不再贴出下载地址。

根据博文中

JSONObject jsonObject=JSONObject.fromObject(objectStr);

Student stu=(Student)JSONObject.toBean(jsonObject, Student.class);

进行转换应该是没有问题,而我遇到的问题是:

1、不能转换

2、简化json串后,数值不正确。

贴一下我的代码:

实体类1:

public class TerminalStatusInstance {

private int DevID;

private int BID;

private int CID;

private int LinkStatus;

private int DevStatus;

private int UnitCount;

private Unitn Unit1;//对象类型属性[实体类二]

private Unitn Unit2;

//省略set/get方法

//源代码是没有构造方法的。

}

实体类2:

public class Unitn {

private Integer Count;

private Integer UnitId;

private Object[] Sta;

//省略set/get方法

//源代码是没有构造方法的。

}

测试json串转java对象:

public static void main(String[] args) {

String str = "{\"BID\":61700,\"CID\":0,\"DevID\":102,\"DevStatus\":0,\"LinkStatus\":0,\"Unit1\":{\"Count\":118,\"Sta\":[\"1\",\"1\",\"1\",\"1\",\"1\",\"0\",0,\"1\",\"1\",1,\"1\",\"0\",\"1\",\"1\",\"1\",\"1\",\"1\",\"1\"],\"UnitId\":9},\"UnitCount\":14}";

//String str = "{\"BID\":61700,\"CID\":3,\"DevID\":22,\"DevStatus\":3,\"LinkStatus\":3,\"UnitCount\":14}";

JSONObject jsonObject=JSONObject.fromObject(str);

TerminalStatusInstance log=(TerminalStatusInstance)JSONObject.toBean(jsonObject, TerminalStatusInstance.class);

System.out.println(log);

}

运行之后报错:

2019-01-09 15:12:37,519 WARN [net.sf.json.JSONObject] - Tried to assign property DevID:java.lang.Integer to bean of class com.cetcnav.suo.ADSB.worker.TerminalStatusInstance

2019-01-09 15:12:37,521 WARN [net.sf.json.JSONObject] - Tried to assign property DevStatus:java.lang.Integer to bean of class com.cetcnav.suo.ADSB.worker.TerminalStatusInstance

2019-01-09 15:12:37,522 WARN [net.sf.json.JSONObject] - Tried to assign property LinkStatus:java.lang.Integer to bean of class com.cetcnav.suo.ADSB.worker.TerminalStatusInstance

Exception in thread "main" net.sf.json.JSONException: java.lang.NoSuchMethodException: Unknown property 'Unit1' on class 'class com.cetcnav.suo.ADSB.worker.TerminalStatusInstance'

at net.sf.json.util.PropertySetStrategy$DefaultPropertySetStrategy._setProperty(PropertySetStrategy.java:69)

at net.sf.json.util.PropertySetStrategy$DefaultPropertySetStrategy.setProperty(PropertySetStrategy.java:60)

at net.sf.json.JSONObject.setProperty(JSONObject.java:1394)

at net.sf.json.JSONObject.toBean(JSONObject.java:443)

at net.sf.json.JSONObject.toBean(JSONObject.java:233)

at com.cetcnav.suo.ADSB.worker.TerminalContrastDifferenceWorker.main(TerminalContrastDifferenceWorker.java:127)

Caused by: java.lang.NoSuchMethodException: Unknown property 'Unit1' on class 'class com.cetcnav.suo.ADSB.worker.TerminalStatusInstance'

at org.apache.commons.beanutils.PropertyUtilsBean.setSimpleProperty(PropertyUtilsBean.java:2123)

at org.apache.commons.beanutils.PropertyUtils.setSimpleProperty(PropertyUtils.java:890)

at net.sf.json.util.PropertySetStrategy$DefaultPropertySetStrategy._setProperty(PropertySetStrategy.java:67)

... 5 more

当时大体猜到应该是因为属性类型为对象类型的缘故,所以就省略了Unit1的值,在测试:

2019-01-09 15:35:28,456 WARN [net.sf.json.JSONObject] - Tried to assign property DevID:java.lang.Integer to bean of class com.cetcnav.suo.ADSB.worker.TerminalStatusInstance

2019-01-09 15:35:28,458 WARN [net.sf.json.JSONObject] - Tried to assign property DevStatus:java.lang.Integer to bean of class com.cetcnav.suo.ADSB.worker.TerminalStatusInstance

2019-01-09 15:35:28,459 WARN [net.sf.json.JSONObject] - Tried to assign property LinkStatus:java.lang.Integer to bean of class com.cetcnav.suo.ADSB.worker.TerminalStatusInstance

2019-01-09 15:35:28,459 WARN [net.sf.json.JSONObject] - Tried to assign property UnitCount:java.lang.Integer to bean of class com.cetcnav.suo.ADSB.worker.TerminalStatusInstance

TerminalStatusInstance [DevID=0, BID=61700, CID=3, LinkStatus=0, DevStatus=0, UnitCount=0, Unit1=null, Unit2=null]

数据不是想要的,DevID=0,

然后网上冲浪~~~

1、无构造函数,

2、Java中Json转换Bean对象并忽略大小写

3、使用json-lib JsonConfig 设置策略。

……

等等一些方法,无奈腹中墨水严重匮乏,没有解决。

然后就用了另外一个方法:ObjectMapper

使用 ObjectMapper类 必须引用3个jar包(jackson-databind,jackson-core,jackson-annotations)

缺少 jackson-core ,会报错 The type com.fasterxml.jackson.core.JsonParser cannot be resolved. It is indirectly referenced from required .class files

缺少 jackson-annotations ,会报错 Exception in thread "main" java.lang.NoClassDefFoundError: com/fasterxml/jackson/annotation/JsonAutoDetect

但是要是用一个注解:@JsonProperty(value="")

ObjectMapper mapper = new ObjectMapper();

try {

TerminalStatusInstance t=(TerminalStatusInstance)mapper.readValue(str,TerminalStatusInstance.class);

System.out.println(t);

} catch (Exception e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

之后测试解决,后期再来搞上面的问题吧。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值