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

目录
相关文章
|
14天前
|
安全 Java API
告别繁琐编码,拥抱Java 8新特性:Stream API与Optional类助你高效编程,成就卓越开发者!
【8月更文挑战第29天】Java 8为开发者引入了多项新特性,其中Stream API和Optional类尤其值得关注。Stream API对集合操作进行了高级抽象,支持声明式的数据处理,避免了显式循环代码的编写;而Optional类则作为非空值的容器,有效减少了空指针异常的风险。通过几个实战示例,我们展示了如何利用Stream API进行过滤与转换操作,以及如何借助Optional类安全地处理可能为null的数据,从而使代码更加简洁和健壮。
44 0
|
2天前
|
Java
java的类详解
在 Java 中,类是面向对象编程的核心概念,用于定义具有相似特性和行为的对象模板。以下是类的关键特性:唯一且遵循命名规则的类名;描述对象状态的私有属性;描述对象行为的方法,包括实例方法和静态方法;用于初始化对象的构造方法;通过封装保护内部属性;通过继承扩展其他类的功能;以及通过多态增强代码灵活性。下面是一个简单的 `Person` 类示例,展示了属性、构造方法、getter 和 setter 方法及行为方法的使用。
|
13天前
|
存储 JSON API
淘系API接口(解析返回的json数据)商品详情数据解析助力开发者
——在成长的路上,我们都是同行者。这篇关于商品详情API接口的文章,希望能帮助到您。期待与您继续分享更多API接口的知识,请记得关注Anzexi58哦! 淘宝API接口(如淘宝开放平台提供的API)允许开发者获取淘宝商品的各种信息,包括商品详情。然而,需要注意的是,直接访问淘宝的商品数据API通常需要商家身份或开发者权限,并且需要遵循淘宝的API使用协议。
淘系API接口(解析返回的json数据)商品详情数据解析助力开发者
|
6天前
|
Java API 开发者
【Java字节码操控新篇章】JDK 22类文件API预览:解锁Java底层的无限可能!
【9月更文挑战第6天】JDK 22的类文件API为Java开发者们打开了一扇通往Java底层世界的大门。通过这个API,我们可以更加深入地理解Java程序的工作原理,实现更加灵活和强大的功能。虽然目前它还处于预览版阶段,但我们已经可以预见其在未来Java开发中的重要地位。让我们共同期待Java字节码操控新篇章的到来!
|
4天前
|
Java
Java 对象和类
在Java中,**类**(Class)和**对象**(Object)是面向对象编程的基础。类是创建对象的模板,定义了属性和方法;对象是类的实例,通过`new`关键字创建,具有类定义的属性和行为。例如,`Animal`类定义了`name`和`age`属性及`eat()`、`sleep()`方法;通过`new Animal()`创建的`myAnimal`对象即可调用这些方法。面向对象编程通过类和对象模拟现实世界的实体及其关系,实现问题的结构化解决。
|
4天前
|
Java API 开发者
【Java字节码的掌控者】JDK 22类文件API:解锁Java深层次的奥秘,赋能开发者无限可能!
【9月更文挑战第8天】JDK 22类文件API的引入,为Java开发者们打开了一扇通往Java字节码操控新世界的大门。通过这个API,我们可以更加深入地理解Java程序的底层行为,实现更加高效、可靠和创新的Java应用。虽然目前它还处于预览版阶段,但我们已经可以预见其在未来Java开发中的重要地位。让我们共同期待Java字节码操控新篇章的到来,并积极探索类文件API带来的无限可能!
|
10天前
|
Java API 开发者
代码小妙招:用Java轻松获取List交集数据
在Java中获取两个 `List`的交集可以通过 `retainAll`方法和Java 8引入的流操作来实现。使用 `retainAll`方法更为直接,但会修改原始 `List`的内容。而使用流则提供了不修改原始 `List`、更为灵活的处理方式。开发者可以根据具体的需求和场景,选择最适合的方法来实现。了解和掌握这些方法,能够帮助开发者在实际开发中更高效地处理集合相关的问题。
10 1
|
16天前
|
机器学习/深度学习 人工智能 算法
探索人工智能在医疗诊断中的应用与挑战Java编程中的对象和类:基础与实践
【8月更文挑战第27天】随着人工智能(AI)技术的飞速发展,其在医疗领域的应用日益广泛。本文深入探讨了AI技术在医疗诊断中的具体应用案例,包括图像识别、疾病预测和药物研发等方面,并分析了当前面临的主要挑战,如数据隐私、算法偏见和法规限制等。文章旨在为读者提供一个全面的视角,理解AI在改善医疗服务质量方面的潜力及其局限性。
|
2天前
|
Java 程序员
Java编程中的对象和类: 初学者指南
【9月更文挑战第9天】在Java的世界中,对象和类构成了编程的基石。本文将引导你理解这两个概念的本质,并展示如何通过它们来构建你的程序。我们将一起探索类的定义,对象的创建,以及它们如何互动。准备好了吗?让我们开始这段Java的旅程吧!
|
4天前
|
存储 JSON API
Python编程:解析HTTP请求返回的JSON数据
使用Python处理HTTP请求和解析JSON数据既直接又高效。`requests`库的简洁性和强大功能使得发送请求、接收和解析响应变得异常简单。以上步骤和示例提供了一个基础的框架,可以根据你的具体需求进行调整和扩展。通过合适的异常处理,你的代码将更加健壮和可靠,为用户提供更加流畅的体验。
21 0

热门文章

最新文章