Json映射为Map,避免定义过多pojo类
我们在开发过程中经常会遇到解析Json字符串的情况,这时候采用开源工具可以快速将json字符串映射为pojo对象。而在某些业务场景中,往往为了获得json字符串中某个属性的值而不得不定义一个pojo类,从而形成与json字符串的对应。一旦json格式发生改变。pojo类也不得不作相应修改。
这时候可以考虑将json与Map映射。只要知道具体的属性名即可获取属性值。
假设有如下Json字符串
{
"id": 100,
"name": "scott",
"birthday": 1480785217693,
"org": {
"id": 1,
"name": "销售部"
}
}
由于Json格式都是键值对形式存在,所以直接映射Map类型即可。这里采用Gson作为Json解析工具。
Gson gson = new GsonBuilder().create();
String json = "{\"id\":100,\"name\":\"scott\",\"birthday\":\"Dec 4, 2016 1:10:33 AM\",\"org\":{\"id\":1,\"name\":\"销售部\"}}";
Map map = gson.fromJson(json, Map.class);
如何取值?传统循环方式
这里用.作为属性名之间的分隔符。
定义解析Map的方法
private <T> T getValueByMap(String path,Map<String, Object> map,Class<T> clazz,Object defaultVal){ String[] params = path.split("\\.");
for(int i=0;i<params.length-1;i++){
map = (Map)map.get(params[i]);
}
Object result = null;
result = map.get(params[params.length-1]); return result == null ? (T) defaultVal : (T) result;
}调用上述方法
String name = getValueByMap("org.name",map,String.class,"");
System.out.println(name); double birthday = getValueByMap("birthday",map,double.class,"");
System.out.println(new Double(birthday).longValue());
Ognl方式,采用该方式需引入Ognl依赖
<dependency>
<groupId>ognl</groupId>
<artifactId>ognl</artifactId>
<version>3.1.12</version>
</dependency>
代码实现
private <T> T getValueByMap(String path, Map<String, Object> map, Class<T> clazz, Object defaultVal) throws OgnlException {
OgnlContext context = new OgnlContext();
context.putAll(map);
Object value = Ognl.getValue(path, context);
return value == null ? (T) defaultVal : (T) value;
}
Json数组处理
假设json字符串如下:
{
"id": 1,
"name": "销售部",
"empSet": [
{
"id": 2,
"name": "scott 2",
"birthday": 1480787444646
},
{
"id": 3,
"name": "scott 3",
"birthday": 1480787444646
},
{
"id": 4,
"name": "scott 4",
"birthday": 1480787444646
},
{
"id": 0,
"name": "scott 0",
"birthday": 1480787444646
},
{
"id": 1,
"name": "scott 1",
"birthday": 1480787444646
}
]
}
用List与Json字符串中的数组部门映射即可。
Gson gson = new GsonBuilder().create(); String json = "{\"id\":1,\"name\":\"销售部\",\"empSet\":[{\"id\":2,\"name\":\"scott 2\",\"birthday\":1480787444646},{\"id\":3,\"name\":\"scott 3\",\"birthday\":1480787444646},{\"id\":4,\"name\":\"scott 4\",\"birthday\":1480787444646},{\"id\":0,\"name\":\"scott 0\",\"birthday\":1480787444646},{\"id\":1,\"name\":\"scott 1\",\"birthday\":1480787444646}]}"; Map map = gson.fromJson(json, Map.class); List emps = getValueByMap("empSet", map, List.class, "");
System.out.println(emps);
另外在解析json过程中,尽量使用double映射数字类型(包括整形与浮点型),后续再进行类型转换即可。
Json映射为Map,避免定义过多pojo类的更多相关文章
- 使用maven根据JSON文件自动生成Java POJO类(Java Bean)源文件
根据JSON文件自动生成Java POJO类(Java Bean)源文件 本文介绍使用程序jsonschema2pojo来自动生成Java的POJO类源文件,本文主要使用maven,其他构建工具请参考 ...
- HibernateTools实现pojo类 数据库schma mapping映射的相互转换 二
接着上一篇博客:HibernateTools实现pojo类 数据库schma mapping映射的相互转换 思路二:由数据库表,生成Mapping映射文件和POJO类. 尽管能够实现,但个人觉着先设计 ...
- 源映射(Source Map)详解
一.什么是源映射 为了提高性能,很多站点都会先压缩 JavaScript 代码然后上线, 但如果代码运行时出现错误,浏览器只会显示在已压缩的代码中的位置,很难确定真正的源码错误位置. 这时源映射就登场 ...
- 痞子衡嵌入式:ARM Cortex-M文件那些事(5)- 映射文件(.map)
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家讲的是嵌入式开发里的map文件. 第四节课里,痞子衡给大家介绍了第一种output文件-relocatable文件,本文继续给大家讲projec ...
- java web(七): mybatis的动态sql和mybatis generator自动生成pojo类和映射文件
前言: MyBatis 的强大特性之一便是它的动态 SQL.如果你有使用 JDBC 或其它类似框架的经验,你就能体会到根据 不同条件拼接 SQL 语句的痛苦.例如拼接时要确保不能忘记添加必要的空格,还 ...
- Hibernate - POJO 类和数据库的映射文件*.hbm.xml
POJO 类和关系数据库之间的映射可以用一个XML文档来定义. 通过 POJO 类的数据库映射文件,Hibernate可以理解持久化类和数据表之间的对应关系,也可以理解持久化类属性与数据库表列之间的对 ...
- [Swift通天遁地]四、网络和线程-(11)将服务器返回的JSON映射为实例对象
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝(https://www.cnblogs. ...
- 十.Protobuf3 JSON映射
Protobuf3 JSON映射 proto 3支持JSON中的规范编码,使得系统之间更容易共享数据.下表按类型对编码进行了描述. 如果JSON编码的数据中缺少一个值,或者如果它的值为null,那么当 ...
- 第二十七篇 玩转数据结构——集合(Set)与映射(Map)
1.. 集合的应用 集合可以用来去重 集合可以用于进行客户的统计 集合可以用于文本词汇量的统计 2.. 集合的实现 定义集合的接口 Set<E> ·void add(E) ...
随机推荐
- Emacs复制粘贴乱码问题以及修改当前文件编码
编码修改: 为了和Linux兼容,win环境下将emacs编码修改为utf-8,随意复制了其他关于emacs编码的配置,如下: (setq locale-coding-system 'utf-8) ( ...
- Eclipse经常使用的快捷键
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbGl1aHVhbmNoYW8=/font/5a6L5L2T/fontsize/400/fill/I0JBQk ...
- Nuget server on IIS6 returns 404
Nuget server on IIS6 returns 404 when downloading package after upgrade 2011年9月2日 8:03:30 (GMT Dayli ...
- go语言基础之字符串类型 和 字符与字符串类型的区别
1.字符串类型 示例1: package main //必须有一个main包 import "fmt" func main() { var str1 string str1 = & ...
- 如何在SharePoint的列表中使用通配符来filter出ListItem?
一个朋友问我这样一个问题, 他想要快速从SharePoint的文档库中filter出来名字中先带有一个Q, 接着一些其他的字符, 后面再跟着有一个数字20这样的文件. 第一个想法就是修改Share ...
- Spring定时器多定时任务配置
spring-task.xml <?xml version="1.0" encoding="UTF-8"?> <beans xmlns=&qu ...
- DNS named.conf文件详解
配置文件: /etc/named.conf /在NAMED.CONF 配置文件中使用//和/* */来进行注释, options { /*OPTIONS选项用来定义一些影响整个DNS服 ...
- [C++基础]那些容易被混淆的概念:函数/数组指针-指针函数/数组,类/函数模板-模板类/函数
函数指针-指针函数 函数指针的重点是指针.表示的是一个指针,它指向的是一个函数.eg: int (*pf)(); 指针函数的重点是函数.表示的是一个函数,它的返回值是指针.eg: int* fun() ...
- sar详解(linux/unix通用)
转载:http://www.toxingwang.com/linux-unix/2027.html sar是linux和unix通用的性能报告工具,常用命令组合如下: sar 命令行的常用格式: sa ...
- ASCII对比表
ASCII控制字符和ASCII可显示字符 ASCII控制字符 二进制 十进制 十六进制 缩写 能够显示的表示法 名称/意义 0000 0000 0 00 NUL ␀ 空字符(Null) 0000 00 ...