如何根据json转javabean 在线格式生成java bean对象

用 annotation 辅助 Json-lib 转换 JavaBean
概述如今大量的 Web 站点应用了 AJAX 技术,通过更少的数据通讯,服务器能够更快的反馈用户请求,再通过 Javascript 的控制,让使用者有了更好的用户体验。JSON 是一种轻量级的数据交换语言,它是 Javascript 的一个子集,又有良好的可读性,经常用于客户端和服务器间的数据交换。因此,在服务器端,常常需要将实体对象(JavaBean)转换为 JSON 格式数据。本文介绍了如何使用 Json-lib 转换 JavaBean 为 JSON 格式数据,并给出解决方法,以及利用 annotation 来增强 Json-lib 的两个功能:一是灵活的筛选 JavaBean 属性;二是通过 JsonValueProcessor 来自定义如何转换 JavaBean 属性到 JSON 数据。JSON 数据格式JSON 的数据格式简单易读,它存在于两种基本形式:
名值对(Collection):名称与值用‘:’分开;名值对之间用‘,’分隔;整体用‘ {} '括起来。例如 {name1:value1, name2:value2}
值的有序队列(Array):即数组,每个值之间用‘,’分隔;整体用‘ [] '括起来。例如:[value1, value2]这两种形式的有机组合,就形成了 JSON 数据。使用 Json-lib 转换 JavaBean 为 JSON 数据Json-lib 是一个 java 工具库,它提供 api 来转换 JavaBean,Map,Collection 等对象为 JSON 数据,或反过来通过 JSON 数据得到 JavaBean。Json-lib 的使用很容易,只要使用 JSONSerializer 的 toJSON 方法就可以转换任意的 Java Object 为 JSON 对象了,再调用 JSON 对象的 toString 方法可以得到转换后的字符串。不过还有一些进一步的问题需要我们自己来解决。清单 1. 使用 JSONSerializerimport net.sf.json.JSONS
List list = new ArrayList();
list.add( "first" );
list.add( "second" );
JSON json = JSONSerializer.toJSON( list );
System.out.println( json.toString() );
// prints ["first","second"]
class MyBean{
private String name = "json";
private int pojoId = 1;
// getters & setters
json = JSONSerializer.toJSON( new MyBean() );
System.out.println( json.toString() );
// prints {"name":"json","pojoId":1}问题 1: 需要有选择的提取 JavaBean 中的属性清单 1 中的例子转换后的 JSON 数据中包含了 JavaBean 中的全部属性,可是我们常常需要有选择的提取 JavaBean 中的特定属性出来。例如:需要过滤掉循环引用的属性,这一点 json-lib 提供了 CycleDetectionStrategy 来处理,但是直接过滤掉更简单;不同的情况下只需要 JavaBean 中的部分属性:比如列表界面只需要显示 Bean 的几个重要属性,而详情界面则需要显示更多的 Bean 的属性;不同的用户权限限制用户只能获得某些属性数据;问题 2: 需要自定义某些属性的转换方式对于普通的 Object 类型(如 Long,String 等),json-lib 有缺省的值转换处理方式,但是对于一些特殊的类型,我们希望用自定义的方式来转换该属性的值。例如:对于 java.util.Date 类型,我们希望直接转换成时间串:,而不希望得到一个类似 {"year":"2010","month":"4","day":"10"} 这样的结果对于常用到的代码数据(比如:性别),在定义时它也许是个 Integer(男:1;女:2),我们希望在转换后直接得到:{"性别":"男",...},而不是 {"性别":"1",...}Json-lib 已经预留出一些接口,让用户修改它的缺省行为。下面我们来看看如何利用 annotation 来配合 Json-lib 解决这两个问题。使用 annotation 筛选 JavaBean 属性JSONSerializer 提供了一个 toJSON 的重载方法,增加一个参数 JsonConfig,可以通过这个参数对 Json-lib 的缺省方式做自定义的配置。清单 2. 自定义 JSONSerializer 的属性过滤器import net.sf.json.JSONS
import net.sf.json.JsonC
import net.sf.json.util.PropertyF
// 定义属性过滤器
PropertyFilter filter = new PropertyFilter(
public boolean apply(Object source, String name, Object value) {
if ( name.equals( “pojoId” ) ) {
// 返回 true, 表示这个属性将被过滤掉
// 注册属性过滤器
JsonConfig config = new JsonConfig();
config.setJsonPropertyFilter( filter );
System.out.println( JSONSerializer.toJSON( new MyBean(), config ) );
// prints {"name":"json"}从清单 2 中可以看出来,Json-lib 通过 PropertyFilter 的 apply 方法进行属性过滤,可以象例子中一样,把所有需要过滤的属性名称写进去,但是这样做太烦琐,也不好维护,对不同的 Bean 要做不同的处理。下面让我们看看怎么利用 annotation 来更方便的处理。首先,需要定义一个 annotation,并给 MyBean 的 get 方法加上标注。清单 3. 定义一个 annotation: Invisibleimport java.lang.annotation.T
import java.lang.annotation.D
import java.lang.annotation.R
import java.lang.annotation.ElementT
import java.lang.annotation.RetentionP
@Documented
@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface Invisible {
public String[] value();
// 为myBean中需要过滤的属性get方法(或者is方法)加上Invisible标注
public class MyBean{
private String name = "json";
private int pojoId = 1;
// getters & setters
public String getName() { }
@Invisible(“LIST”)
// 在 “LIST” 情况下不要这个属性
public int getPojoId() { return pojoId; }
}然后,我们需要一些能处理 annotation 的 PropertyFilter 类。清单 4. 处理 annotation 的 PropertyFilter 类import java.util.M
import java.lang.reflect.M
import net.sf.json.util.PropertyF
// 先实现一个abstract类,将读取Bean属性的Method找到并传递给子类处理
public abstract class AbstractMethodFilter implements PropertyFilter {
// 这个方法留给子类实现,以便适应不同的过滤需求
public abstract boolean apply(final Method method);
public boolean apply(final Object source, final String name, final Object value) {
if (source instanceof Map) {
String propName = name.substring(0, 1).toUpperCase() + name.substring(1);
Class clz = source.getClass();
String methodName = "get" + propN
Method method =
method = clz.getMethod(methodName, (Class[]) null);
// 寻找属性的get方法
} catch (NoSuchMethodException nsme) {
String methodName2 =
"is" + propN
// 也许是个is方法
method = clz.getMethod(methodName2, (Class[]) null);
} catch (NoSuchMethodException ne) {
// 没有找到属性的get或者is方法,打印错误,返回true
System.err.println(“No such methods: ”
+ methodName + “ or “ + methodName2);
return apply(method);
} // END: AbstractMethodFilter
public class InvisibleFilter extends AbstractMethodFilter {
// 过滤条件,标注中有符合这个条件的property将被过滤掉
private String _sGUIID;
public InvisibleFilter(final String guiid) {
public boolean apply(final Method method) {
if (_sGUIID == null || _sGUIID.equals(“”)) {
// 表示不做限制
if (method.isAnnotationPresent(Invisible.class)) {
Invisible anno = method.getAnnotation(Invisible.class);
String[] value = anno.value();
for (int i = 0; i & value. i++) {
if (_sGUIID.equals(value[i])) {
}现在只要把这个 filter 注册到 JsonConfig 中,就实现了属性的过滤,请看清单 5。清单 5. 使用 InvisibleFilter 来过滤不需要的属性JsonConfig config = new JsonConfig();
config.setJsonPropertyFilter( new InvisibleFilter(“LIST”)); //标注了LIST的属性将被过滤掉
System.out.println( JSONSerializer.toJSON( new MyBean(), config ) );
// prints {"name":"json"}增加其他的 annotation 及 Filter 就可以实现不同的属性过滤方式了。使用 annotation 自定义 Bean 属性的转换方式Json-lib 通过 JsonConfig 提供了自定义属性转换方式的接口。清单 6. 注册 JsonValueProcessorJsonConfig config = new JsonConfig();
config.registerJsonValueProcessor(java.util.Date.class, new JsDateJsonValueProcessor());注册后 Json-lib 在遇到 java.uitl.Date 类型的属性时,会应用 JsDateJsonValueProcessor 的处理方法。所以,只要实现自己的 JsonValueProcessor 就可以自定义各种 Object 的转换方式了。根据上一节的讨论,Json-lib 在转换 Bean 属性之前,会将属性数据传递给 PropertyFilter 来判断是否需要过滤掉。因此,我们可以通过一个 Filter 对象获得 Bean 的属性的标注数据,并将它传递给特定的 Processor,Processor 根据得到的标注值知道应该怎么处理这个属性。下面以整型代码为例,说明处理的方法。一般情况下,一个项目中会涉及许多种不同的代码,我们会为每一种代码定义一个主代码号(代码往往都是整型的),为它的子项定义几个子代码号。例如,我们定义性别的主代码号为 100,并定义男:1,女:2。首先,需要一个代码标注(IntegerCode)及一个处理这种标注的 PropertyFilter。清单 7. IntegerCode 及 IntegerCodeFilter@Documented
@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface IntegerCode {
public int value();
public class IntegerCodeFilter extends AbstractMethodFilter {
// 代码处理器
private IntegerCodeProcessor _
public IntegerCodeFilter(final IntegerCodeProcessor processor) {
_processor =
// 不过滤属性,但当发现IntegerCode标注时,将数据传递给Processor
public boolean apply(final Method method) {
if (_processor == null) {
// 表示没有特别的处理
if (method.isAnnotationPresent(IntegerCode.class)) {
IntegerCode anno = method.getAnnotation(IntegerCode.class);
int code = anno.value();
_processor.setMainCode(code);
// 将code设置为主代码
}现在,我们需要一个 JsonValueProcessor 来处理 IntegerCode 数据。清单 8. IntegerCodeProcessorpublic class IntegerCodeProcessor implements JsonValueProcessor {
private int _iMainC
public void setMainCode(final int mainCode) { _iMainCode = mainC }
public IntegerCodeProcessor() {
} // END: IntegerCodeProcessor
private void reset() {
_iMainCode = -1;
public Object processArrayValue(Object value, JsonConfig jsonConfig) {
return process(value, jsonConfig);
} // END: processArrayValue
public Object processObjectValue(
String key, Object value, JsonConfig jsonConfig ) {
return process( value, jsonConfig );
} // END: processObjectValue
private Object process(Object value, JsonConfig jsonConfig) {
if (value == null) {
String ret =
if (value instanceof Integer && _iMainCode &= 0) {
int code = value.intValue();
switch (_iMainCode) {
// 这里使用简单的case 处理不同的代码
if (code == 1) {
// 好一点的方式是从资源文件中读取对应值
ret = "man";
} else if (code == 2) {
ret = "woman";
ret = value.toString();
ret = value.toString();
ret = value.toString();
// 处理后重置,以免影响其他 Integer 属性
} // END: process
}现在,我们创建一个 JavaBean:Student 来测试这个 Processor。清单 9. 测试 IntegerCodeProcessorpublic class Student {
private String name = "camry";
private int gender = 1;
// getters & setters
public String getName() { }
@IntegerCode(100)
// 性别主代码为 100
public int getGender() { }}
IntegerCodeProcessor processor = new IntegerCodeProcessor();
IntegerCodeFilter filter = new IntegerCodeFilter(processor);
JsonConfig config = new JsonConfig();
config.setJsonPropertyFilter( filter );
config.registerJsonValueProcessor(Integer.class, processor);
System.out.println( JSONSerializer.toJSON( new Student(), config ) );
// prints {“gender”:”man”, "name":"camry"}结束语Json-lib 可以很方便的进行 JavaBean 到 JSON 数据的转换,再结合 annotation 为 JavaBean 的属性定义元数据,可以减少代码,提高效率。
相关主题“”(developerWorks,2008 年 8 月):本文将快速讲解 JSON 格式,并通过代码示例演示如何分别在客户端和服务器端进行 JSON 格式数据的处理。“”(developerWorks,2007 年 4 月):讨论另一种有用的数据格式 JSON,以及如何使用它更轻松地在应用程序中移动数据和对象。
主页,了解 JSON 数据格式的详细说明。
参考“”,了解 Json-lib 的实现与使用。
参考“”,了解更多关于 annotation 的知识。
:数百篇关于 Java 编程各个方面的文章。
添加或订阅评论,请先或。
有新评论时提醒我
static.content.url=/developerworks/js/artrating/SITE_ID=10Zone=Java technology, Open sourceArticleID=500805ArticleTitle=用 annotation 辅助 Json-lib 转换 JavaBeanpublish-date=Json生成Java实体类工具( 在线Json生成JavaBean代码 )
请贴入要生成JavaBean的Json代码
复制成功! &&已经成功复制到剪切板&&可直接粘贴到任意地方.
Json字符串转换成Java实体类
1,贴入json内容,Javabean的类名、包名即可自动生成JavaBean代码,并可以直接打包下载源码
2,支持将任意复杂/简单格式的Json字符串生成Javabean实体类
3,提供Json格式错误提示,不会格式化不符合规范的Json字符串,确保了Javabean实体类的准确性Android根据Json直接生成JavaBean - CSDN博客
Android根据Json直接生成JavaBean
在开发过程中拿到从服务器请求的json字符串需要解析成Bean对象方便我们使用,自己写bean又太麻烦
经过这么长时间的开发,我收集了三种比较常用的通过json自动生成Bean对象的方法:
方法 一:使用在线生成工具:
这种方法的优点是在线方便,使用时打开网址把json格式的字符串复制斤去直接就能生成Bean对象文件下载即可,缺点是不能生成单一的Bean对象,会生成多个Bean对象文件,而且每一个class文件都会带有 Copyright 2016 aTool.org
很多时候我们需要生成一个干净的Bean对象文件,一个个删除很繁琐。
方法 二:安装即可
使用方法如下图:&
只需要输入包名、Bean对象名,保存路径、jsonUrl可以在jsonUrl中输入json文件的路径,或者把json字符串直接复制到json内容框里,然后根据自己的需要选择线面的复选框(单个Bean,序列化,有参构造,getter/setter,toString)是否需要勾选,最后点击生成即可&
下载地址:
方法 三 :
(声明:以下博文非本人原创,本人只是觉得写得很不错,想把这几种方法收集起来以备查阅)
通过AndroidStudio插件GsonFormat:根据Json自动生成JavaBean
此处参考了&源于未知&的博文:&
&在线安装要打开VPN,因为Google在国内被禁&
使用方法:
Code - Generate - GsonFormat
快捷键:Alt + Insert
&注意提前新建好一个空的JavaBean类&
2.将Json文本粘贴进去
3.点击OK,就生成了JavaBean类
本文已收录于以下专栏:
相关文章推荐
在开发过程中拿到服务器穿来的json字符串需要解析成Bean对象方便我们使用,自己写bean又太麻烦
经过这么长时间的Android开发,我收集了三种比较常用的通过json自动生成Bea...
这个是自己写的方法, 可能有点杂乱.
public class ConvertUtil {
* 把非空属性拷贝到新对象
* @param from
* @para...
最近项目让前端定义json格式,之前没有定义过json,自己搞了二个多小时才弄好,搞定后发现还是很简单的.一,AS中央仓库下载gson或者直接在gradle中配置
compile 'com.go...
本次笔记本人重点如下:
1.如何将JavaBean转化成JSONObject +JSONObject转化成JSONArray+JSONArray转化成JSONObject乃至JavaBean
json的解析,归根结底就是用JsonObject以及JsonArray来实现的。
在日常中,当我们拿到一个较为复杂的json字符串的时候,用以上两个虽然能实现解析,但显得很麻烦。这里介绍下用Gso...
向大家介绍我开发的一款工具,json-to-java.它可以帮助java程序员,通过json生成对应的javabean。当你需要调用json返回格式的api时,该工具特别有用。功能介绍我们开发的jav...
你还在为文档里铺天盖地滴变量, 结构复杂的json而烦恼吗~
写错了一个类型,然后各种崩溃
写错了一个变量名无法解析
代码工具来啦~
自动生成javabean类,只要一键~
...
这是一个可以将 json 字符串 直接绑定到 view 上的库, 不用先将 json 转换为 model 类。
/gplibs/android-data-bin...
他的最新文章
讲师:何宇健
讲师:董岩
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)详谈JSON与Javabean转换的几种形式
投稿:jingxian
字体:[ ] 类型:转载 时间:
下面小编就为大家带来一篇详谈JSON与Javabean转换的几种形式。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
JSON格式的数据传递是最常用的方法之一,以下列出了常用的几种形态以及与Javabean之间的转换:
String json1="{'name':'zhangsan','age':23,'interests':[{'interest':'篮球','colors':['绿色','黄色']},{'interest':'足球','colors':['红色','蓝色']}]}";
String json2="[{'name':'zhangsan'},{'name':'lisi'},{'name':'王五'}]";
String json3="{'1':{'name':'zhangsan'},'3':{'name':'lisi'},'4':{'name':'wangwu'}}";//map
String json4="{'name':'zhangsan','age':23}";
首先,此处的转化依赖两个JAR包
&!-- /artifact/com.google.code.gson/gson --&
&dependency&
&groupId&com.google.code.gson&/groupId&
&artifactId&gson&/artifactId&
&version&2.8.1&/version&
&/dependency&
&!-- /artifact/org.json/json --&
&dependency&
&groupId&org.json&/groupId&
&artifactId&json&/artifactId&
&version&&/version&
&/dependency&
其次,封装的Javabean代码如下
import java.util.L
public class UserBean {
private List&InterestBean&
public String getName() {
public void setName(String name) {
this.name =
public Integer getAge() {
public void setAge(Integer age) {
this.age =
public List&InterestBean& getInterests() {
public void setInterests(List&InterestBean& interests) {
this.interests =
class InterestBean{
private List&String&
public String getInterest() {
public void setInterest(String interest) {
this.interest =
public List&String& getColors() {
public void setColors(List&String& colors) {
this.colors =
1、普通的json4格式的JSON解析:
public void testParseJson(){
JSONObject jsonObj = new JSONObject(json4);
String name = jsonObj.getString("name");
int age = jsonObj.getInt("age");
System.out.println(name);
System.out.println(age);
UserBean user = new UserBean();
user.setAge(age);
user.setName(name);
2、数组形式的JSON解析以及GSON解析:
public void testJsonArray(){
JSONArray jsonArray = new JSONArray(json2);
for (int i = 0; i & jsonArray.length(); i++) {
JSONObject jsonObj = jsonArray.getJSONObject(i);
String name = jsonObj.getString("name");
System.out.println(name);
* 解析json数组
public void testParseListJson(){
Gson gson = new Gson();
Type type = new TypeToken&List&UserBean&&(){}.getType();
List&UserBean& users = gson.fromJson(json2, type);
for(UserBean user:users){
System.out.println(user.getName());
3、内嵌JSON形式的JSON与GSON解析:
* 内嵌JSON解析
public void testParseJson1(){
JSONObject rootJson = new JSONObject(json1);
JSONArray jsonInterestArray = rootJson.getJSONArray("interests");
for (int i = 0; i & jsonInterestArray.length(); i++) {
JSONObject interestJsonObj = jsonInterestArray.getJSONObject(i);
String interest = interestJsonObj.getString("interest");
System.out.println(interest);
Object obj = interestJsonObj.get("colors");
System.out.println(obj);
* 内嵌GSON解析
public void testSimpleJson(){
Gson gson = new Gson();
UserBean user = gson.fromJson(json1, UserBean.class);
System.out.println(user.getName());
System.out.println(user.getAge());
System.out.println(user.getInterests().size());
List&InterestBean& list = user.getInterests();
for(InterestBean bean:list) {
System.out.println(bean.getInterest());
List&String& colors = bean.getColors();
for(String color:colors){
System.out.println(color);
4、Map形式的JSON的GSON解析:
* 解析一个map类型的json
public void testParseMapJson(){
Gson gson = new Gson();
Type type = new TypeToken&Map&String,UserBean&&(){}.getType();
Map&String,UserBean& map = gson.fromJson(json3, type);
Set&String& keys = map.keySet();
for(String key:keys){
UserBean bean = map.get(key);
System.out.println(key);
System.out.println(bean.getName());
5、将一个JavaBean对象封装成JSON格式
* 将一个JavaBean对象封装成JSON格式
public String testJavaBean2Json(){
UserBean userBean = new UserBean();
userBean.setName("zhangsan");
userBean.setAge(33);
List&InterestBean& list = new ArrayList&InterestBean&();
InterestBean bean1 = new UserBean().new InterestBean();
bean1.setInterest("篮球1");
InterestBean bean2 = new UserBean().new InterestBean();
bean2.setInterest("篮球2");
list.add(bean1);
list.add(bean2);
userBean.setInterests(list);
//将User Bean转换成Json
Gson gson = new Gson();
String jsonStr = gson.toJson(userBean);
System.out.println(jsonStr);
return jsonS
仅供参考,如有雷同,纯属巧合^_^
以上这篇详谈JSON与Javabean转换的几种形式就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持脚本之家。
您可能感兴趣的文章:
大家感兴趣的内容
12345678910
最近更新的内容
常用在线小工具博客分类:
1,json格式的字符串
public class Demo {
public static void main(String[] args) throws Exception {
String str = "{\"a\":\"b\", \"c\":\"d\"}";
JSONObject a = new JSONObject(str);
System.out.println(a); // {"c":"d","a":"b"}
System.out.println(a.get("c")); // d
2,json数组的格式
其中AlarmRecord为javabean对象 字段包括a,b,a
public List&AlarmRecord& getJson() throws Exception{
String str="[{"a":1,"b":"2","c":3},
{"a":1,"b":"2","c":3}]"
JSONArray jArray=JSONArray.fromObject(str);
List&AlarmRecord& list=JSONArray.toList(jArray,AlarmRecord.class);
用的jar包请下载 附件
下载次数: 194
浏览 38210
浏览: 112155 次
来自: 上海
(window.slotbydup=window.slotbydup || []).push({
id: '4773203',
container: s,
size: '200,200',
display: 'inlay-fix'

我要回帖

更多关于 javabean转换成json 的文章

 

随机推荐