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

目录
相关文章
|
19小时前
|
安全 Java 调度
Java一分钟:多线程编程初步:Thread类与Runnable接口
【5月更文挑战第11天】本文介绍了Java中创建线程的两种方式:继承Thread类和实现Runnable接口,并讨论了多线程编程中的常见问题,如资源浪费、线程安全、死锁和优先级问题,提出了解决策略。示例展示了线程通信的生产者-消费者模型,强调理解和掌握线程操作对编写高效并发程序的重要性。
10 3
|
1天前
|
SQL Java
java处理数据查看范围
java处理数据查看范围
|
1天前
|
Java
【JAVA基础篇教学】第五篇:Java面向对象编程:类、对象、继承、多态
【JAVA基础篇教学】第五篇:Java面向对象编程:类、对象、继承、多态
|
2天前
|
存储 安全 Java
Java容器类List、ArrayList、Vector及map、HashTable、HashMap
Java容器类List、ArrayList、Vector及map、HashTable、HashMap
|
2天前
|
XML JSON API
转Android上基于JSON的数据交互应用
转Android上基于JSON的数据交互应用
|
2天前
|
Java 编译器 开发者
Java一分钟之-继承:复用与扩展类的特性
【5月更文挑战第9天】本文探讨了Java中的继承机制,通过实例展示了如何使用`extends`创建子类继承父类的属性和方法。文章列举了常见问题和易错点,如构造器调用、方法覆盖、访问权限和类型转换,并提供了解决方案。建议深入理解继承原理,谨慎设计类结构,利用抽象类和接口以提高代码复用和扩展性。正确应用继承能构建更清晰、灵活的代码结构,提升面向对象设计能力。
9 0
|
2天前
|
Java
【Java多线程】面试常考 —— JUC(java.util.concurrent) 的常见类
【Java多线程】面试常考 —— JUC(java.util.concurrent) 的常见类
12 0
|
3天前
|
Java API 调度
【Java多线程】Thread类的基本用法
【Java多线程】Thread类的基本用法
6 0
|
3天前
|
SQL Java 数据库连接
JDBC Java标准库提供的一些api(类+方法) 统一各种数据库提供的api
JDBC Java标准库提供的一些api(类+方法) 统一各种数据库提供的api
9 0
|
3天前
|
Java
Java一分钟之-类与对象:面向对象编程入门
【5月更文挑战第8天】本文为Java面向对象编程的入门指南,介绍了类与对象的基础概念、常见问题及规避策略。文章通过代码示例展示了如何定义类,包括访问修饰符的适当使用、构造器的设计以及方法的封装。同时,讨论了对象创建与使用时可能遇到的内存泄漏、空指针异常和数据不一致等问题,并提供了相应的解决建议。学习OOP需注重理论与实践相结合,不断编写和优化代码。
26 1