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

简介: 版权声明:本文为博主chszs的原创文章,未经博主允许不得转载。 https://blog.csdn.net/chszs/article/details/12585791 《一种从JSON数据创建Java类的高效办法》作者:chszs,转载需注明。
版权声明:本文为博主chszs的原创文章,未经博主允许不得转载。 https://blog.csdn.net/chszs/article/details/12585791

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





目录
相关文章
|
Java API 开发工具
【Azure Developer】Java代码实现获取Azure 资源的指标数据却报错 "invalid time interval input"
在使用 Java 调用虚拟机 API 获取指标数据时,因本地时区设置非 UTC,导致时间格式解析错误。解决方法是在代码中手动指定时区为 UTC,使用 `ZoneOffset.ofHours(0)` 并结合 `withOffsetSameInstant` 方法进行时区转换,从而避免因时区差异引发的时间格式问题。
482 4
|
数据采集 JSON Java
Java爬虫获取1688店铺所有商品接口数据实战指南
本文介绍如何使用Java爬虫技术高效获取1688店铺商品信息,涵盖环境搭建、API调用、签名生成及数据抓取全流程,并附完整代码示例,助力市场分析与选品决策。
|
数据采集 存储 前端开发
Java爬虫性能优化:多线程抓取JSP动态数据实践
Java爬虫性能优化:多线程抓取JSP动态数据实践
|
12月前
|
JSON 网络协议 安全
【Java】(10)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
609 1
|
12月前
|
JSON 网络协议 安全
【Java基础】(1)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
541 1
|
算法 Java
Java多线程编程:实现线程间数据共享机制
以上就是Java中几种主要处理多线程序列化资源以及协调各自独立运行但需相互配合以完成任务threads 的技术手段与策略。正确应用上述技术将大大增强你程序稳定性与效率同时也降低bug出现率因此深刻理解每项技术背后理论至关重要.
708 16
|
传感器 分布式计算 安全
Java 大视界 -- Java 大数据在智能安防入侵检测系统中的多源数据融合与分析技术(171)
本文围绕 Java 大数据在智能安防入侵检测系统中的应用展开,剖析系统现状与挑战,阐释多源数据融合及分析技术,结合案例与代码给出实操方案,提升入侵检测效能。
|
机器学习/深度学习 JSON 监控
淘宝拍立淘按图搜索与商品详情API的JSON数据返回详解
通过调用taobao.item.get接口,获取商品标题、价格、销量、SKU、图片、属性、促销信息等全量数据。
|
12月前
|
JSON API 数据格式
淘宝拍立淘按图搜索API系列,json数据返回
淘宝拍立淘按图搜索API系列通过图像识别技术实现商品搜索功能,调用后返回的JSON数据包含商品标题、图片链接、价格、销量、相似度评分等核心字段,支持分页和详细商品信息展示。以下是该API接口返回的JSON数据示例及详细解析:
|
12月前
|
JSON 算法 API
Python采集淘宝商品评论API接口及JSON数据返回全程指南
Python采集淘宝商品评论API接口及JSON数据返回全程指南