`
jomper
  • 浏览: 38038 次
  • 性别: Icon_minigender_1
  • 来自: 湖北-武汉
社区版块
存档分类
最新评论

简单实用的Object2JSON小工具:JSONUtil

    博客分类:
  • Java
阅读更多
本工具用来把Java对象转换成JSON格式输出.小巧实用,接口友好欢迎大家拍砖,指导.

1 基本功能:
1.1 支持基本类型及其包装类和Date的解析.
1.2 支持指定关联关系类的解析
1.3 支持数组,List的解析
1.4 支持忽略一层嵌套类(见说明 3.2)

2 基本调用方法:
JSONUtil.object2JSON(object,stringBuffer,new Class[]{...});


3 说明:
3.1 思路就是解析指定你想要解析的类(new Class[]{...}),然后通过StringBuffer输出.你指定什么就解析什么,不指定就不解析.这样做的目的就是既能自动解析对象又能减少无意义的数据解析也能从另一个层面避免嵌套. 如果不需要指定可以写成这样:
JSONUtil.object2JSON(object,stringBuffer)

3.2 root object 的类型不用指定,只需要指定内部属性就行。
3.3 嵌套不好防范,已经是你自己手动指定,所以请注意不要出现嵌套.本身出现嵌套的模型可能也有问题吧?就算是tree nodes也通常用是外键关联parent id来处理的。所以我基本是放弃了嵌套的处理,由你自己指定要处理的类,自己注意。
3.4 POJO里最好不要有setter,getter之外的方法,如果需要你完全可以写到工具类。已经处理过出现单独属性的情况.
3.5 可以定义DateFormat的格式,见下面的范例4.3
3.6 源码和UT附件下载.

4 范例:4.1基本解析:
	WordType wt = new WordType();
	wt.setName("f");
	wt.setId(3);
		
	Word w = new Word();
	w.setName("a");
	w.setType(wt);
	JSONUtil.object2JSON(w,stringBuffer,new Class[]{WordType.class});


输出:
Word:{"name":"a","type":{"id":3,"name":"f"}}


4.2 数组和List解析
	Tag t = new Tag();
	t.setName("t");
	Tag tt = new Tag();
	tt.setName("tt");
	Tag[] ttt = {t,tt};
		
	WordType wt = new WordType();
	wt.setName("f");
	wt.setId(3);
		
	Word w = new Word();
	w.setName("a");
	w.setType(wt);
	w.setTags(ttt);
		
	WordType wtt = new WordType();
	wtt.setName("gg");
	wtt.setId(2);
	
	Word ww = new Word();
	ww.setName("aa");
	ww.setType(wtt);
	ww.setTags(new Tag[]{t});
	List<Tag> tagList = new ArrayList<Tag>();
	tagList.add(t);
	tagList.add(tt);
	ww.setTagList(tagList);
	JSONUtil.object2JSON(new Word[]{w,ww},stringBuffer,new Class[]{WordType.class,Tag.class});


输出:
[Word:{"name":"a","tags":[{"name":"t"},{"name":"tt"}],"type":{"id":3,"name":"f"}},Word:{"name":"aa","tagList":[{"name":"t"},{"name":"tt"}],"tags":[{"name":"t"}],"type":{"id":2,"name":"gg"}}]


4.3 基本类型,包装类,日期解析
	LangObject lo = new LangObject();
	lo.setBooleanValue(true);
	lo.setByteValue(Byte.valueOf("2"));
	lo.setCharacterValue(Character.valueOf('3'));
	lo.setDoubleValue(4.0);
	lo.setFloatValue(5f);
	lo.setIntegerValue(6);
	lo.setLongValue(7l);
	lo.setShortValue(Short.valueOf("8"));
		
	lo.setBooleanObject(true);
	lo.setByteObject(Byte.valueOf("2"));
	lo.setCharacterObject(Character.valueOf('3'));
	lo.setDoubleObject(4.0);
	lo.setFloatObject(5f);
	lo.setIntegerObject(6);
	lo.setLongObject(7l);
	lo.setShortObject(Short.valueOf("8"));
		
	lo.setUtilDate(new java.util.Date());
	lo.setSqlDate(java.sql.Date.valueOf("2009-6-6"));
	
	JSONUtil.DATE_FORMAT = "yyyy/MM/dd";
	JSONUtil.object2JSON(lo,stringBuffer);


输出:
LangObject:{"booleanObject":"true","booleanValue":"true","byteObject":2,"byteValue":2,"characterObject":"3","characterValue":"3","doubleObject":4.0,"doubleValue":4.0,"floatObject":5.0,"floatValue":5.0,"integerObject":6,"integerValue":6,"longObject":7,"longValue":7,"shortObject":8,"shortValue":8,"sqlDate":"2009/06/06","utilDate":"2009/06/12"}


2009-6-25
上传:
用Collection接口替代List
去掉对象名
分享到:
评论
12 楼 jomper 2009-06-26  
asklxf 写道
jomper 写道
asklxf 写道
jomper 写道
asklxf 写道
很久以前写的java2json的转换:
http://www.ibm.com/developerworks/cn/web/wa-lo-json/

谢谢你的推荐, 犹豫无法下载只能从表面猜测您的做法。
希望能提供源代码,学习您的思想。

从接口上看,我自认为没有我处理的好。指定对象解析,是我提出的要点。


小工具不需要接口,不用搞那么复杂

代码下不了可能是code.google.com还在被挟持中


可能有点误会,我说的接口是,使用接口(你的 toJson(object)),而不是java的interface.你至少是没有看过的代码,甚至连我的说明都懒得看就贴了您的URL。呵呵。


看过你的代码,觉得比较复杂,因为json的数据对象是固定的几种,映射到java也很简单,没有必要指定class[],通过反射+递归就可以解析出json对象,返回string比传入stringbuffer好,接口越简单越好:

String toJson(Object o)


1.对于有没有必要指定需要解析的class[]
1.1 因为是反射+递归解析,碰到一个大点的对象就会解析到很深。但是需要的json数据不见得的需要全部的内容。指定class[]以后可以更灵活的处理你需要的数据内容,提高性能。还能避免object.getClass这样没有用的数据.
1.2 碰到嵌套异常怎么办?告诉别人这个工具不行了,用别的吧?所以指定需要解析的class[]能有效的避免嵌套异常。至少可以不去解析那个可能引起嵌套异常的类。
1.3 本身class[]是动态参数,可以忽略。

2.对于是否要用stringbuffer
2.1 我一直很提倡pass by value的做法
2.2 很多情况下并不是给出一个object2json的数据就能满足,例如EXT需要一个totalProperty和root参数。用stringbuffer更容易去包装这个json数据.而不是扔给别人一个string去"+"了事的。

3.这个工具是否复杂
3.1 这个方法一共3个参数,其中一个还是动态参数。完全在sun对于方法参数个数建议的范围内.
3.2 这个工具用很小的代价,带来了更灵活的处理方式,这个代价我是可以接受的。
3.3 在除jdk5外不依赖任何包的前提下一共不到100行的代码完成了以上功能,我觉得还是对得起观众的。呵呵。

google code可以连接后,我有幸拜读了你的源码.
1.对于在toJson(o)里RuntimeException Unsupported type且不做处理的方式有疑问,反射是机械的,所以考虑不到全部情况很正常。这里忽略比立即停止抛出异常要好。不然显得程序的容错性很差。
2.还是在toJson(o)里instanceof Map后武断的转化成MAP<String,Object>是有问题的。类里面有个其他泛型约束的Map出现是完全合理的(例如Map<Object,Object>),在你这里就会出错。
3.解析对象为null,往数据里填充个"null",实在无法理解,貌似"{null}"也不是个合法格式吧?诸如此类的还有很多,就不一一说明了。
4.对于基本类型大量的instanceof判断颇有微词,你可以参考下我是怎么做的,这个做法也是借鉴javaeye的一个高手的,呵呵。

总之我抱着学习探讨的心态还是很高兴的,感谢你关注我的帖子,感谢您的建议,共勉。
11 楼 asklxf 2009-06-26  
jomper 写道
asklxf 写道
jomper 写道
asklxf 写道
很久以前写的java2json的转换:
http://www.ibm.com/developerworks/cn/web/wa-lo-json/

谢谢你的推荐, 犹豫无法下载只能从表面猜测您的做法。
希望能提供源代码,学习您的思想。

从接口上看,我自认为没有我处理的好。指定对象解析,是我提出的要点。


小工具不需要接口,不用搞那么复杂

代码下不了可能是code.google.com还在被挟持中


可能有点误会,我说的接口是,使用接口(你的 toJson(object)),而不是java的interface.你至少是没有看过的代码,甚至连我的说明都懒得看就贴了您的URL。呵呵。


看过你的代码,觉得比较复杂,因为json的数据对象是固定的几种,映射到java也很简单,没有必要指定class[],通过反射+递归就可以解析出json对象,返回string比传入stringbuffer好,接口越简单越好:

String toJson(Object o)
10 楼 jomper 2009-06-25  
asklxf 写道
jomper 写道
asklxf 写道
很久以前写的java2json的转换:
http://www.ibm.com/developerworks/cn/web/wa-lo-json/

谢谢你的推荐, 犹豫无法下载只能从表面猜测您的做法。
希望能提供源代码,学习您的思想。

从接口上看,我自认为没有我处理的好。指定对象解析,是我提出的要点。


小工具不需要接口,不用搞那么复杂

代码下不了可能是code.google.com还在被挟持中


可能有点误会,我说的接口是,使用接口(你的 toJson(object)),而不是java的interface.你至少是没有看过的代码,甚至连我的说明都懒得看就贴了您的URL。呵呵。
9 楼 asklxf 2009-06-25  
jomper 写道
asklxf 写道
很久以前写的java2json的转换:
http://www.ibm.com/developerworks/cn/web/wa-lo-json/

谢谢你的推荐, 犹豫无法下载只能从表面猜测您的做法。
希望能提供源代码,学习您的思想。

从接口上看,我自认为没有我处理的好。指定对象解析,是我提出的要点。


小工具不需要接口,不用搞那么复杂

代码下不了可能是code.google.com还在被挟持中
8 楼 jomper 2009-06-25  
asklxf 写道
很久以前写的java2json的转换:
http://www.ibm.com/developerworks/cn/web/wa-lo-json/

谢谢你的推荐, 犹豫无法下载只能从表面猜测您的做法。
希望能提供源代码,学习您的思想。

从接口上看,我自认为没有我处理的好。指定对象解析,是我提出的要点。
7 楼 asklxf 2009-06-25  
很久以前写的java2json的转换:
http://www.ibm.com/developerworks/cn/web/wa-lo-json/
6 楼 jomper 2009-06-25  
grandboy 写道
呵呵,我前几天刚自己实现了一个这样的工具。

建议: 实现一个反向的功能, 就是json2Object.


如 liangx 的需求,他要求不要用变量名也不用类名做json的对象名。要实现反向必须用类名,不然无法find class for name.这里就出现矛盾了。

而且这里加上类名会使生成json格式不合法。

其他没有什么问题,XML的正向反向我早在XMLUtil里实现了,在博客里有。

另外把支持List变成了支持collection,有空我传一下。
5 楼 jomper 2009-06-25  
liangx 写道
自己改了.其实现在有很多JSON的库.但是那些无用的功能太多.试了一下这个.功能不错.拿来用了.不介意吧!

的确,我这边的也改了,因为那样会照成json格式不合法。我尽快上传。
开源的当然不介意啊.
4 楼 grandboy 2009-06-25  
呵呵,我前几天刚自己实现了一个这样的工具。

建议: 实现一个反向的功能, 就是json2Object.
3 楼 liangx 2009-06-25  
自己改了.其实现在有很多JSON的库.但是那些无用的功能太多.试了一下这个.功能不错.拿来用了.不介意吧!
2 楼 jomper 2009-06-12  
liangx 写道
每个对象前面的对象名称能不能不显示?

可以啊,只是目前被我去掉了。 一般显示属性名吧?要是觉得simple类名好,我可以加上开关。
1 楼 liangx 2009-06-12  
每个对象前面的对象名称能不能不显示?

相关推荐

    json数据转换工具jsonutil

    JSONUtil是一个Java工具类,专门设计用于处理JSON数据,它提供了方便的方法将JSON字符串与Java对象之间进行转换,无需依赖其他外部jar包。本文将深入探讨JSONUtil的核心功能及其在实际开发中的应用。 首先,...

    JsonUitl(一 个json转成list的简单通用工具类)

    JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,被广泛用于Web应用程序之间传递数据。它基于JavaScript的一个子集,格式简洁且易于读写,同时也易于机器解析和生成。`JsonUtil` 是一个Java工具类,...

    JsonUtil工具类

    2. JSON转对象:反之,JsonUtil也提供了反序列化的方法,如`fromJson(String json, Class&lt;T&gt; clazz)`,根据给定的JSON字符串和目标类型创建一个新的Java对象。Jackson通过分析JSON结构并调用相应的构造函数或setter...

    json 转化工具类

    User user = JsonUtil.jsonToObject(jsonString, User.class); ``` 以上就是关于“json 转化工具类”的一些基础知识,这类工具类极大地简化了JSON与Java对象之间的交互,提高了开发效率。在实际开发中,根据项目的...

    JAVA-JSON工具转换类

    总的来说,`JAVA-JSON工具转换类`这个主题涵盖了JSON数据处理的核心部分,包括JSON的序列化和反序列化,以及数据类型的转换。通过`json-lib`和`ezmorph`这两个库,开发者可以轻松地在Java程序中处理JSON数据,而`...

    JsonUtils(Json转换工具类)

    《JsonUtils:强大的Json转换工具类》 在Java开发中,JSON作为一种轻量级的数据交换格式,被广泛用于服务器与客户端之间的数据传输。为了方便开发者处理JSON格式的数据,出现了许多库,如Jackson、Gson、Fastjson等...

    JsonUtil代码工具类

    本文将深入探讨“JsonUtil”代码工具类的相关知识点,主要基于提供的两个文件:JsonParser.java和JsonValue.java。 JsonUtil工具类通常包含了处理JSON对象与Java对象之间转换的一系列方法。在描述中提到的“2个工具...

    struts2+json的使用

    而JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,广泛用于前后端数据交互。在Struts2中集成JSON,可以方便地将服务器端处理的结果以JSON格式传递给前端,简化数据传输并提高应用性能。 一、...

    android常用json传值解析工具类

    在Android开发中,数据交换和序列化经常使用JSON(JavaScript Object Notation)格式,因为它的轻量级、易读易写以及广泛支持。本篇文章将详细介绍如何使用阿里巴巴的Fastjson库进行JSON操作,并封装成一个方便使用...

    Json转对象忽略大小写

    在Java开发中,JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,常用于前后端数据传输。标准的JSON规范要求键(key)必须使用双引号括起,并且大小写敏感。然而,有时我们可能遇到JSON字符串的键首...

    object与 json 相互转换工具类

    CSDN上另外一篇博客的附带资源太贵了,我就整个最便宜的来造福社会吧! 内附使用说明,傻瓜式使用教学 //list 转json ...List&lt;String&gt; list2 = g2.fromJson(str1, new TypeToken&lt;List&lt;String&gt;&gt;(){}.getType());

    Json全部jar包

    JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,被广泛用于Web服务和应用程序之间的数据传输。它易于人阅读和编写,同时也易于机器解析和生成。在Java中,为了处理JSON数据,我们需要相关的库,这...

    JSON 转BEAN 工具包

    JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,被广泛用于前后端交互,而BEAN(JavaBean)是Java编程中的一个概念,代表具有特定规则的Java类,通常用作数据容器。将JSON转换为BEAN或者反之,是...

    Java Json生成工具 源代码

    "util"包通常用于存放各种通用工具类,这里的"JsonUtil"可能是对已有JSON库的一个简单封装,以提供更加便捷的使用方式。比较"lyzjson"与"JsonUtil"的性能、易用性、功能完备性,可以帮助我们评估它们在实际项目中的...

    Java的JsonUtil

    总结来说,`JsonUtil`是Java中处理JSON转换的实用工具类,它封装了流行JSON库的功能,提供了一致且简洁的API,使得开发者能更高效地在Java对象和JSON字符串之间进行转换。通过分析`JsonUtil.java`源代码,我们可以...

    struts2与json插件(2)

    在Struts2中,JSON(JavaScript Object Notation)插件是用于处理JSON数据交换的重要组件,这使得Struts2能够与前端的AJAX或者JavaScript进行高效的数据交互。JSON是一种轻量级的数据交换格式,易于人阅读和编写,...

    json-plugin

    JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,被广泛用于Web应用程序之间传递数据。JSON-plugin,根据标题和描述,可能是一个插件或工具,它的主要功能是与JSON数据进行交互,可能是为了简化JSON...

    json所有驱动包

    JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,它采用完全独立于语言的文本格式,但也使用了类似于C家族语言(包括C、C++、C#、Java、JavaScript、Perl、Python等)的习惯,这使得它易于人阅读和...

    bean2json_v20200515.zip

    总结来说,"bean2json_v20200515.zip"是一个轻量级的Java工具,用于快速将简单的Java Bean对象转换为JSON字符串,适合简单的测试和调试场景。在实际开发中,根据需求的复杂性,可能需要更强大的库来满足所有需求。...

Global site tag (gtag.js) - Google Analytics