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

简介: JSON格式的数据经常会遇到,比如调用Web服务,取回的数据通常就是JSON格式的。如何高效地把JSON数据转换成实际的Java类对象,就是本文要说明的问题。 写一个操纵JSON数据的Java程序,通常代码会重度依赖于JSON API,你总是需要对JSON数据进行反序列化,再转换成原生Java对象。

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方法。


[java]   view plain copy print ?
  1. package com.cypressnorth.demo.models.twitter;  
  2.    
  3. import java.util.List;  
  4.    
  5. public class TwitterItem{  
  6.     private String contributors;  
  7.     private transient Geo coordinates;  
  8.     private String created_at;  
  9.     private Entities entities;  
  10.     private Number favorite_count;  
  11.     private boolean favorited;  
  12.     private Geo geo;  
  13.     private Number id;  
  14.     private String id_str;  
  15.     private String in_reply_to_screen_name;  
  16.     private String in_reply_to_status_id;  
  17.     private String in_reply_to_status_id_str;  
  18.     private String in_reply_to_user_id;  
  19.     private String in_reply_to_user_id_str;  
  20.     private String lang;  
  21.     private boolean possibly_sensitive;  
  22.     private Number retweet_count;  
  23.     private boolean retweeted;  
  24.     private Retweeted_status retweeted_status;  
  25.     private String source;  
  26.     private String text;  
  27.     private boolean truncated;  
  28.     private User user;  
  29.    
  30.     public TwitterItem(){}  
  31.    
  32.     public String getContributors(){  
  33.         return this.contributors;  
  34.     }  
  35.     public void setContributors(String contributors){  
  36.         this.contributors = contributors;  
  37.     }  
  38.     public Geo getCoordinates(){  
  39.         return this.coordinates;  
  40.     }  
  41.     public void setCoordinates(Geo coordinates){  
  42.         this.coordinates = coordinates;  
  43.     }  
  44.     public String getCreated_at(){  
  45.         return this.created_at;  
  46.     }  
  47.     public void setCreated_at(String created_at){  
  48.         this.created_at = created_at;  
  49.     }  
  50.     public Entities getEntities(){  
  51.         return this.entities;  
  52.     }  
  53.     public void setEntities(Entities entities){  
  54.         this.entities = entities;  
  55.     }  
  56.     public Number getFavorite_count(){  
  57.         return this.favorite_count;  
  58.     }  
  59.     public void setFavorite_count(Number favorite_count){  
  60.         this.favorite_count = favorite_count;  
  61.     }  
  62.     public boolean getFavorited(){  
  63.         return this.favorited;  
  64.     }  
  65.     public void setFavorited(boolean favorited){  
  66.         this.favorited = favorited;  
  67.     }  
  68.     public Geo getGeo(){  
  69.         return this.geo;  
  70.     }  
  71.     public void setGeo(Geo geo){  
  72.         this.geo = geo;  
  73.     }  
  74.     public Number getId(){  
  75.         return this.id;  
  76.     }  
  77.     public void setId(Number id){  
  78.         this.id = id;  
  79.     }  
  80.     public String getId_str(){  
  81.         return this.id_str;  
  82.     }  
  83.     public void setId_str(String id_str){  
  84.         this.id_str = id_str;  
  85.     }  
  86.     public String getIn_reply_to_screen_name(){  
  87.         return this.in_reply_to_screen_name;  
  88.     }  
  89.     public void setIn_reply_to_screen_name(String in_reply_to_screen_name){  
  90.         this.in_reply_to_screen_name = in_reply_to_screen_name;  
  91.     }  
  92.     public String getIn_reply_to_status_id(){  
  93.         return this.in_reply_to_status_id;  
  94.     }  
  95.     public void setIn_reply_to_status_id(String in_reply_to_status_id){  
  96.         this.in_reply_to_status_id = in_reply_to_status_id;  
  97.     }  
  98.     public String getIn_reply_to_status_id_str(){  
  99.         return this.in_reply_to_status_id_str;  
  100.     }  
  101.     public void setIn_reply_to_status_id_str(String in_reply_to_status_id_str){  
  102.         this.in_reply_to_status_id_str = in_reply_to_status_id_str;  
  103.     }  
  104.     public String getIn_reply_to_user_id(){  
  105.         return this.in_reply_to_user_id;  
  106.     }  
  107.     public void setIn_reply_to_user_id(String in_reply_to_user_id){  
  108.         this.in_reply_to_user_id = in_reply_to_user_id;  
  109.     }  
  110.     public String getIn_reply_to_user_id_str(){  
  111.         return this.in_reply_to_user_id_str;  
  112.     }  
  113.     public void setIn_reply_to_user_id_str(String in_reply_to_user_id_str){  
  114.         this.in_reply_to_user_id_str = in_reply_to_user_id_str;  
  115.     }  
  116.     public String getLang(){  
  117.         return this.lang;  
  118.     }  
  119.     public void setLang(String lang){  
  120.         this.lang = lang;  
  121.     }  
  122.     public boolean getPossibly_sensitive(){  
  123.         return this.possibly_sensitive;  
  124.     }  
  125.     public void setPossibly_sensitive(boolean possibly_sensitive){  
  126.         this.possibly_sensitive = possibly_sensitive;  
  127.     }  
  128.     public Number getRetweet_count(){  
  129.         return this.retweet_count;  
  130.     }  
  131.     public void setRetweet_count(Number retweet_count){  
  132.         this.retweet_count = retweet_count;  
  133.     }  
  134.     public boolean getRetweeted(){  
  135.         return this.retweeted;  
  136.     }  
  137.     public void setRetweeted(boolean retweeted){  
  138.         this.retweeted = retweeted;  
  139.     }  
  140.     public Retweeted_status getRetweeted_status(){  
  141.         return this.retweeted_status;  
  142.     }  
  143.     public void setRetweeted_status(Retweeted_status retweeted_status){  
  144.         this.retweeted_status = retweeted_status;  
  145.     }  
  146.     public String getSource(){  
  147.         return this.source;  
  148.     }  
  149.     public void setSource(String source){  
  150.         this.source = source;  
  151.     }  
  152.     public String getText(){  
  153.         return this.text;  
  154.     }  
  155.     public void setText(String text){  
  156.         this.text = text;  
  157.     }  
  158.     public boolean getTruncated(){  
  159.         return this.truncated;  
  160.     }  
  161.     public void setTruncated(boolean truncated){  
  162.         this.truncated = truncated;  
  163.     }  
  164.     public User getUser(){  
  165.         return this.user;  
  166.     }  
  167.     public void setUser(User user){  
  168.         this.user = user;  
  169.     }  
  170. }  

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


一、自动生成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工具的不足,它实际上能节省你大量的开发时间,也会帮助你减少错误,不错的工具。

目录
相关文章
|
4天前
|
Java 程序员 容器
Java中的变量和常量:数据的‘小盒子’和‘铁盒子’有啥不一样?
在Java中,变量是一个可以随时改变的数据容器,类似于一个可以反复打开的小盒子。定义变量时需指定数据类型和名称。例如:`int age = 25;` 表示定义一个整数类型的变量 `age`,初始值为25。 常量则是不可改变的数据容器,类似于一个锁死的铁盒子,定义时使用 `final` 关键字。例如:`final int MAX_SPEED = 120;` 表示定义一个名为 `MAX_SPEED` 的常量,值为120,且不能修改。 变量和常量的主要区别在于变量的数据可以随时修改,而常量的数据一旦确定就不能改变。常量主要用于防止意外修改、提高代码可读性和便于维护。
|
13天前
|
存储 安全 Java
java.util的Collections类
Collections 类位于 java.util 包下,提供了许多有用的对象和方法,来简化java中集合的创建、处理和多线程管理。掌握此类将非常有助于提升开发效率和维护代码的简洁性,同时对于程序的稳定性和安全性有大有帮助。
36 17
|
5天前
|
存储 缓存 安全
在 Java 编程中,创建临时文件用于存储临时数据或进行临时操作非常常见
在 Java 编程中,创建临时文件用于存储临时数据或进行临时操作非常常见。本文介绍了使用 `File.createTempFile` 方法和自定义创建临时文件的两种方式,详细探讨了它们的使用场景和注意事项,包括数据缓存、文件上传下载和日志记录等。强调了清理临时文件、确保文件名唯一性和合理设置文件权限的重要性。
13 2
|
5天前
|
Java
Java 8 引入的 Streams 功能强大,提供了一种简洁高效的处理数据集合的方式
Java 8 引入的 Streams 功能强大,提供了一种简洁高效的处理数据集合的方式。本文介绍了 Streams 的基本概念和使用方法,包括创建 Streams、中间操作和终端操作,并通过多个案例详细解析了过滤、映射、归并、排序、分组和并行处理等操作,帮助读者更好地理解和掌握这一重要特性。
11 2
|
4天前
|
安全 Java
Java多线程集合类
本文介绍了Java中线程安全的问题及解决方案。通过示例代码展示了使用`CopyOnWriteArrayList`、`CopyOnWriteArraySet`和`ConcurrentHashMap`来解决多线程环境下集合操作的线程安全问题。这些类通过不同的机制确保了线程安全,提高了并发性能。
|
9天前
|
存储 Java 程序员
Java基础的灵魂——Object类方法详解(社招面试不踩坑)
本文介绍了Java中`Object`类的几个重要方法,包括`toString`、`equals`、`hashCode`、`finalize`、`clone`、`getClass`、`notify`和`wait`。这些方法是面试中的常考点,掌握它们有助于理解Java对象的行为和实现多线程编程。作者通过具体示例和应用场景,详细解析了每个方法的作用和重写技巧,帮助读者更好地应对面试和技术开发。
41 4
|
9天前
|
存储 分布式计算 Java
存算分离与计算向数据移动:深度解析与Java实现
【11月更文挑战第10天】随着大数据时代的到来,数据量的激增给传统的数据处理架构带来了巨大的挑战。传统的“存算一体”架构,即计算资源与存储资源紧密耦合,在处理海量数据时逐渐显露出其局限性。为了应对这些挑战,存算分离(Disaggregated Storage and Compute Architecture)和计算向数据移动(Compute Moves to Data)两种架构应运而生,成为大数据处理领域的热门技术。
27 2
|
9天前
|
Java 编译器 开发者
Java异常处理的最佳实践,涵盖理解异常类体系、选择合适的异常类型、提供详细异常信息、合理使用try-catch和finally语句、使用try-with-resources、记录异常信息等方面
本文探讨了Java异常处理的最佳实践,涵盖理解异常类体系、选择合适的异常类型、提供详细异常信息、合理使用try-catch和finally语句、使用try-with-resources、记录异常信息等方面,帮助开发者提高代码质量和程序的健壮性。
20 2
|
14天前
|
存储 安全 Java
如何保证 Java 类文件的安全性?
Java类文件的安全性可以通过多种方式保障,如使用数字签名验证类文件的完整性和来源,利用安全管理器和安全策略限制类文件的权限,以及通过加密技术保护类文件在传输过程中的安全。
|
15天前
|
SQL Java OLAP
java实现“数据平滑升级”
java实现“数据平滑升级”
35 2