【问题解决】关于JSON和JavaBean互转使用方法

项目场景:

在处理json字符串时,遇到需要将标准格式的json转换为对应的JavaBean,因此进行如下尝试:

JSON字符串如下:

{
	"uid": "4210030030001409999",
	"city": "荆州市",
	"geom": "{\"type\":\"Point\",\"coordinates\":[112.14885956,30.348678684]}",
	"road": "九阳大道北",
	"address": "湖北省荆州市荆州区九阳大道北16号",
	"district": "荆州区",
	"province": "湖北省",
	"township": "城南街道",
	"doorplate": 16,
	"doorplate_sub": null
}

JavaBean如下:

@Data
public class DoorPlateElement implements Serializable {
    private String uid;
    private String address;
    private String province;
    private String city;
    private String district;
    private String road;
    private String township;
    private Integer doorplate;
    private Integer doorplate_sub;
    private String geom;
}

JavaBean结构和JSON是一一对应的。


使用工具

pom.xml依赖:

	<dependency>
		<groupId>net.sf.json-lib</groupId>
		<artifactId>json-lib</artifactId>
		<version>2.4</version>
		<classifier>jdk15</classifier>
	</dependency>

引用:
import net.sf.json.JSONObject;

代码:
使用JSONObject.toBean方法,将json字符串转为DoorPlateElement类。

	JSONObject jsonObject = JSONObject.fromObject(jsonString);
	DoorPlateElement doorPlateElement = (DoorPlateElement) JSONObject.toBean(jsonObject,DoorPlateElement.class);
	System.out.println(doorPlateElement.getGeom());

报错:
java.lang.NoSuchMethodException: Unknown property ‘coordinates’ on class ‘class java.lang.String’

问题分析

报错在于json字符串中geom下有两层的json嵌套,但是在javabean中设置的格式为String,造成不匹配,因此需要修改javabean结构,改为JSONObject或者Object均可,考虑到后续空间数据入库一致性,这里修改geomObject格式。

修改后JavaBean如下:

@Data
public class DoorPlateElement implements Serializable {
    private String uid;
    private String address;
    private String province;
    private String city;
    private String district;
    private String road;
    private String township;
    private Integer doorplate;
    private Integer doorplate_sub;
    private Object geom;
}

修改后输出,可以实现get()和set()读写,但是读取geom属性时候,这里的geom为对象,需要转为字符串进行下一步入库。

在这里插入图片描述

因此,使用函数:

	JSONObject.fromObject(doorPlateElement.getGeom())

输出:
在这里插入图片描述


发现新问题

JSONObject输出的浮点型精度损失严重,对于坐标串来说无法接受,因此需要新方法重新实现。

解决方法:

使用谷歌提供的json包gson解决

pom.xml依赖:

	<dependency>
		<groupId>com.google.code.gson</groupId>
		<artifactId>gson</artifactId>
		<version>2.8.5</version>
	</dependency>

引用:import com.google.gson.Gson;

代码:

	DoorPlateElement doorPlateElement = new Gson().fromJson(jsonString.toString(), DoorPlateElement.class);

该方法输出的geom结果直接为原样的json字符串,不需要额外转换,可以直接使用。并且精度没有损失。

在这里插入图片描述


补充:JavaBean转JSON

补充1:Gson()转换java对象到JSON

Gson().toJson()方法

	Gson gson =new Gson();
	User user = new User(123,"hhhh");
	String str = gson.toJson(user);
	System.out.println(str);

补充2:JSONObject()转换java对象到JSON

Java对象->String类型->JSONObject

	User user = new User(123,"hhhh");
	String jsonString= JSONObject.toJSONString(user);
	JSONObject jsonObject=JSONObject.parseObject(jsonString);
	System.out.println(jsonObject);

java对象直接转JSONObject

	User user = new User(123,"hhhh");
	JSONObject jsonObject= (JSONObject) JSONObject.toJSON(user);
	System.out.println(jsonObject);
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值