《一种从JSON数据创建Java类的高效办法》

作者:chszs,转载需注明。博客主页:http://blog.csdn.net/chszs

JSON格式的数据经常会遇到,比如调用Web服务,取回的数据通常就是JSON格式的。如何高效地把JSON数据转换成实际的Java类对象,就是本文要说明的问题。

写一个操纵JSON数据的Java程序,通常代码会重度依赖于JSON API,你总是需要对JSON数据进行反序列化,再转换成原生Java对象。整个过程大致如下:

1)下载所有的JSON响应;

2)分析JSON对象的结构,映射到Java类;

3)手动煞费苦心地创建每一个Java类,键入每个Java类的私有属性名和数据类型,以匹配JSON所有对象的属性;

4)为每个Java类创建public类型的getter和setter方法。

package com.cypressnorth.demo.models.twitter;

import java.util.List;

public class TwitterItem{
private String contributors;
private transient Geo coordinates;
private String created_at;
private Entities entities;
private Number favorite_count;
private boolean favorited;
private Geo geo;
private Number id;
private String id_str;
private String in_reply_to_screen_name;
private String in_reply_to_status_id;
private String in_reply_to_status_id_str;
private String in_reply_to_user_id;
private String in_reply_to_user_id_str;
private String lang;
private boolean possibly_sensitive;
private Number retweet_count;
private boolean retweeted;
private Retweeted_status retweeted_status;
private String source;
private String text;
private boolean truncated;
private User user; public TwitterItem(){} public String getContributors(){
return this.contributors;
}
public void setContributors(String contributors){
this.contributors = contributors;
}
public Geo getCoordinates(){
return this.coordinates;
}
public void setCoordinates(Geo coordinates){
this.coordinates = coordinates;
}
public String getCreated_at(){
return this.created_at;
}
public void setCreated_at(String created_at){
this.created_at = created_at;
}
public Entities getEntities(){
return this.entities;
}
public void setEntities(Entities entities){
this.entities = entities;
}
public Number getFavorite_count(){
return this.favorite_count;
}
public void setFavorite_count(Number favorite_count){
this.favorite_count = favorite_count;
}
public boolean getFavorited(){
return this.favorited;
}
public void setFavorited(boolean favorited){
this.favorited = favorited;
}
public Geo getGeo(){
return this.geo;
}
public void setGeo(Geo geo){
this.geo = geo;
}
public Number getId(){
return this.id;
}
public void setId(Number id){
this.id = id;
}
public String getId_str(){
return this.id_str;
}
public void setId_str(String id_str){
this.id_str = id_str;
}
public String getIn_reply_to_screen_name(){
return this.in_reply_to_screen_name;
}
public void setIn_reply_to_screen_name(String in_reply_to_screen_name){
this.in_reply_to_screen_name = in_reply_to_screen_name;
}
public String getIn_reply_to_status_id(){
return this.in_reply_to_status_id;
}
public void setIn_reply_to_status_id(String in_reply_to_status_id){
this.in_reply_to_status_id = in_reply_to_status_id;
}
public String getIn_reply_to_status_id_str(){
return this.in_reply_to_status_id_str;
}
public void setIn_reply_to_status_id_str(String in_reply_to_status_id_str){
this.in_reply_to_status_id_str = in_reply_to_status_id_str;
}
public String getIn_reply_to_user_id(){
return this.in_reply_to_user_id;
}
public void setIn_reply_to_user_id(String in_reply_to_user_id){
this.in_reply_to_user_id = in_reply_to_user_id;
}
public String getIn_reply_to_user_id_str(){
return this.in_reply_to_user_id_str;
}
public void setIn_reply_to_user_id_str(String in_reply_to_user_id_str){
this.in_reply_to_user_id_str = in_reply_to_user_id_str;
}
public String getLang(){
return this.lang;
}
public void setLang(String lang){
this.lang = lang;
}
public boolean getPossibly_sensitive(){
return this.possibly_sensitive;
}
public void setPossibly_sensitive(boolean possibly_sensitive){
this.possibly_sensitive = possibly_sensitive;
}
public Number getRetweet_count(){
return this.retweet_count;
}
public void setRetweet_count(Number retweet_count){
this.retweet_count = retweet_count;
}
public boolean getRetweeted(){
return this.retweeted;
}
public void setRetweeted(boolean retweeted){
this.retweeted = retweeted;
}
public Retweeted_status getRetweeted_status(){
return this.retweeted_status;
}
public void setRetweeted_status(Retweeted_status retweeted_status){
this.retweeted_status = retweeted_status;
}
public String getSource(){
return this.source;
}
public void setSource(String source){
this.source = source;
}
public String getText(){
return this.text;
}
public void setText(String text){
this.text = text;
}
public boolean getTruncated(){
return this.truncated;
}
public void setTruncated(boolean truncated){
this.truncated = truncated;
}
public User getUser(){
return this.user;
}
public void setUser(User user){
this.user = user;
}
}

整个过程显然很耗时间,而且还容易出现键入错误或数据类型匹配错误。

一、自动生成Java存根Stub

在线网站:http://jsongen.byingtondesign.com/

它提供了JSON解析并对JSON数据结构进行建模,生成Java类的功能。你可以自定义包名,输出的内容是一个ZIP文件,里面根据包名路径,包含生成的Java实体类。

你可以把得到的Java类文件放入到你的项目中,以便对JSON访问反序列化/序列化时使用。

二、注意事项

此工具能节省不少时间,然而,它不是一劳永逸的解决方案。

JSON数据的一个显著缺点是其集合或属性的数据类型并不能通过程序100%精准的判断,这是因为数据的展现是宽松的。比如,一个整数值可以被表示为“1”或者1。而JSON Gen工具并不能确定“1”是整数还是字符串,因此你最终会得到大量的字符串类型的属性。所以,需要你手动地去检查每一个生成的Java类,看所有的私有属性的数据类型是否正确。

此工具另一个潜在的问题是它在运行时只能关注对象,如果API响应变化,生成的Java文件或许会丢失部分元素。

三、节省时间

除开JSON Gen工具的不足,它实际上能节省你大量的开发时间,也会帮助你减少错误,不错的工具。

一种从JSON数据创建Java类的高效办法的更多相关文章

  1. Java JSON数据创建和读取

    Java  json数据创建 package com.JavaTest; import com.google.gson.JsonArray; import com.google.gson.JsonOb ...

  2. JSON数据与Java对象的相互转换

    JSON数据与Java对象的相互转换 JSON解析器 常见的解析器:Jsonlib .Gson. fastjson. jackson JSON转化为Java对象 使用步骤: 1.导入jackson的相 ...

  3. 【自制工具类】struts返回json数据包装格式类

    自己写的一个给struts返回的json数据包装格式类,不喜勿喷,原创,需在项目中引入com.alibaba.fastjson的jar包 先看下效果(这里没有使用msg,有兴趣的往下看): 上demo ...

  4. 创建java类并实例化类对象

    创建java类并实例化类对象例一1.面向对象的编程关注于类的设计2.设计类实际上就是设计类的成员3.基本的类的成员,属性(成员变量)&方法 面向对象思想的落地法则一:1.设计类,并设计类的成员 ...

  5. Eclipse 创建 Java 类

    打开新建 Java 类向导 你可以使用新建 Java 类向导来创建 Java 类,可以通过以下途径打开 Java 类向导: 点击 "File" 菜单并选择 New > Cla ...

  6. Eclipse 创建 Java 类---Eclipse教程第10课

    打开新建 Java 类向导 你可以使用新建 Java 类向导来创建 Java 类,可以通过以下途径打开 Java 类向导: 点击 "File" 菜单并选择 New > Cla ...

  7. android开发学习 ------- json数据与实体类之间的相互转换

    在网络请求的时候,会返回给我们实体类,我们需要将实体类转化为json字符串,方便处理数据: 有时候也会将json数据转换为实体类. 在Android Studio中,json要互相转换,需要用到gso ...

  8. vs里根据json快速创建对应类的方法

    有时候,我们在调用别人接口的时候,服务端返回了一个json格式的字符串,我们要获取json里面的数据的话一般有两种方式: 1.通过正则 2.反序列化成一个对象 第一种方式这里不再多说,主要说一下第二种 ...

  9. JSON数据和Java对象的相互转换

    JSON解析器: 常见的解析器: Jsonlib, Gson, fastjson, jackson 其中应用最广泛的是jackson,阿里的fastjson虽然比jackson快一点,但存在的问题比较 ...

随机推荐

  1. Java API ——Character类

    1.Character类的概述 · Character 类在对象中包装一个基本类型 char 的值 · 此外,该类提供了几种方法,以确定字符的类别(小写字母,数字,等等),并将字符从大写转换成小写,反 ...

  2. java 参数传递是引用传递还是值传递?

    JAVA的参数传递倒底是值传递还是引用传递,我觉得两种说法都没错,关键是看怎么理解“引用”和“引用传递”. (一)从编译原理的角度讲,所有那些无法通过形参来修改实参本身的传递机制都是“值传递”,在JA ...

  3. NLog 传递参数

    用NLog记文件日志,一般都用{$basedir}变量,把日志记在运行的目录或者它的子目录下,遇到要写在其他目录的下,看了下Nlog找到用环境变量传参数. .net 里写 Environment.Se ...

  4. jquery 分页控件(二)

    上一章主要是关于分页控件的原理,代码也没有重构.在这一章会附上小插件的下载链接,插件主要就是重构逻辑部分,具体可以下载源文件看下,源代码也有注释.为了测试这个插件是能用的,我弄了个简单的asp.net ...

  5. window国际化文案

    越来越多的程序支持多语言切换,或者能自动适应当前系统语言,让自己开发的程序支持多语言不仅可以让自己的程序被国人使用,也能让外国程序爱好者使用.VC开发多语言程序有多种方法,或读取配置文件,或使用不同资 ...

  6. Java这点事

    1--代码片段:  1 2 3 4 5 byte b1=1,b2=2,b3,b6;  final byte b4=4,b5=6;  b6=b4+b5;  b3=(b1+b2);  System.out ...

  7. (三)学习JavaScript之getElementsByTagName方法

    参考:http://www.w3school.com.cn/jsref/met_doc_getelementsbytagname.asp HTML DOM Document 对象 定义和用法 getE ...

  8. Struts2 教程

    一.Struts2是什么 Struts2是在WebWork2基础发展而来的.和Struts1一样, Struts2也是基于MVC的web层框架. 那么既然有了Struts1,为何还要Struts2? ...

  9. C# 有关文件路径的操作

    1. 由文件全路径,获取文件扩展名.文件名等信息 string fullPath = @"\WebSite1\Default.aspx"; string filename = Sy ...

  10. Testlink & Redmine组合拳演练

    环境:Ubuntu 14.04LTS 一.部署testlink 查看已安装软件: dpkg -l *apache* (apache2.4.7) dpkg -l *php* (未安装) dpkg -l ...