热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

使用在线工具jsonschema2pojo根据json生成java对象

本文介绍了使用在线工具jsonschema2pojo根据json生成java对象的方法。通过该工具,用户只需将json字符串复制到输入框中,即可自动将其转换成java对象。该工具还能解析列表式的json数据,并将嵌套在内层的对象也解析出来。本文以请求github的api为例,展示了使用该工具的步骤和效果。

如果你还在自己手动写model对象,那你就out了。

场景:使用retrofit请求github的api,要使返回的数据自动解析到java对象中你必须准备好一个和json完全对应的java对象。而github的一个Repository有很多字段,如这个请求:

你可以直接打开这个链接查看返回的json数据。可以看到里面有很多数据项,如果我们手动写这个java对象将非常耗费时间。

所幸现在有了转换的工具。

jsonschema2pojo

jsonschema2pojo  是一个根据json转换成java对象的开源项目,只要把你的json字符串复制到相应的输入框中就能自动将其转换成java对象。它的强大之处在于,能解析列表式的json数据,把嵌套在内层的对象也解析出来。

先以上面的api请求为例,得到的json如下,这是一个单一的Repository数据:{

"id": 1296269,

"name": "Hello-World",

"full_name": "octocat/Hello-World",

"owner": {

"login": "octocat",

"id": 583231,

"avatar_url": "https://avatars.githubusercontent.com/u/583231?v=3",

"gravatar_id": "",

"url": "https://api.github.com/users/octocat",

"html_url": "https://github.com/octocat",

"followers_url": "https://api.github.com/users/octocat/followers",

"following_url": "https://api.github.com/users/octocat/following{/other_user}",

"gists_url": "https://api.github.com/users/octocat/gists{/gist_id}",

"starred_url": "https://api.github.com/users/octocat/starred{/owner}{/repo}",

"subscriptions_url": "https://api.github.com/users/octocat/subscriptions",

"organizations_url": "https://api.github.com/users/octocat/orgs",

"repos_url": "https://api.github.com/users/octocat/repos",

"events_url": "https://api.github.com/users/octocat/events{/privacy}",

"received_events_url": "https://api.github.com/users/octocat/received_events",

"type": "User",

"site_admin": false

},

"private": false,

"html_url": "https://github.com/octocat/Hello-World",

"description": "This your first repo!",

"fork": false,

"url": "https://api.github.com/repos/octocat/Hello-World",

"forks_url": "https://api.github.com/repos/octocat/Hello-World/forks",

"keys_url": "https://api.github.com/repos/octocat/Hello-World/keys{/key_id}",

"collaborators_url": "https://api.github.com/repos/octocat/Hello-World/collaborators{/collaborator}",

"teams_url": "https://api.github.com/repos/octocat/Hello-World/teams",

"hooks_url": "https://api.github.com/repos/octocat/Hello-World/hooks",

"issue_events_url": "https://api.github.com/repos/octocat/Hello-World/issues/events{/number}",

"events_url": "https://api.github.com/repos/octocat/Hello-World/events",

"assignees_url": "https://api.github.com/repos/octocat/Hello-World/assignees{/user}",

"branches_url": "https://api.github.com/repos/octocat/Hello-World/branches{/branch}",

"tags_url": "https://api.github.com/repos/octocat/Hello-World/tags",

"blobs_url": "https://api.github.com/repos/octocat/Hello-World/git/blobs{/sha}",

"git_tags_url": "https://api.github.com/repos/octocat/Hello-World/git/tags{/sha}",

"git_refs_url": "https://api.github.com/repos/octocat/Hello-World/git/refs{/sha}",

"trees_url": "https://api.github.com/repos/octocat/Hello-World/git/trees{/sha}",

"statuses_url": "https://api.github.com/repos/octocat/Hello-World/statuses/{sha}",

"languages_url": "https://api.github.com/repos/octocat/Hello-World/languages",

"stargazers_url": "https://api.github.com/repos/octocat/Hello-World/stargazers",

"contributors_url": "https://api.github.com/repos/octocat/Hello-World/contributors",

"subscribers_url": "https://api.github.com/repos/octocat/Hello-World/subscribers",

"subscription_url": "https://api.github.com/repos/octocat/Hello-World/subscription",

"commits_url": "https://api.github.com/repos/octocat/Hello-World/commits{/sha}",

"git_commits_url": "https://api.github.com/repos/octocat/Hello-World/git/commits{/sha}",

"comments_url": "https://api.github.com/repos/octocat/Hello-World/comments{/number}",

"issue_comment_url": "https://api.github.com/repos/octocat/Hello-World/issues/comments{/number}",

"contents_url": "https://api.github.com/repos/octocat/Hello-World/contents/{+path}",

"compare_url": "https://api.github.com/repos/octocat/Hello-World/compare/{base}...{head}",

"merges_url": "https://api.github.com/repos/octocat/Hello-World/merges",

"archive_url": "https://api.github.com/repos/octocat/Hello-World/{archive_format}{/ref}",

"downloads_url": "https://api.github.com/repos/octocat/Hello-World/downloads",

"issues_url": "https://api.github.com/repos/octocat/Hello-World/issues{/number}",

"pulls_url": "https://api.github.com/repos/octocat/Hello-World/pulls{/number}",

"milestones_url": "https://api.github.com/repos/octocat/Hello-World/milestones{/number}",

"notifications_url": "https://api.github.com/repos/octocat/Hello-World/notifications{?since,all,participating}",

"labels_url": "https://api.github.com/repos/octocat/Hello-World/labels{/name}",

"releases_url": "https://api.github.com/repos/octocat/Hello-World/releases{/id}",

"created_at": "2011-01-26T19:01:12Z",

"updated_at": "2015-10-08T07:23:02Z",

"pushed_at": "2015-10-02T01:04:21Z",

"git_url": "git://github.com/octocat/Hello-World.git",

"ssh_url": "[email protected]:octocat/Hello-World.git",

"clone_url": "https://github.com/octocat/Hello-World.git",

"svn_url": "https://github.com/octocat/Hello-World",

"homepage": "",

"size": 566,

"stargazers_count": 1402,

"watchers_count": 1402,

"language": null,

"has_issues": true,

"has_downloads": true,

"has_wiki": true,

"has_pages": false,

"forks_count": 1110,

"mirror_url": null,

"open_issues_count": 139,

"forks": 1110,

"open_issues": 139,

"watchers": 1402,

"default_branch": "master",

"network_count": 1110,

"subscribers_count": 1747

}

其中有一个数据项比较特殊,那就是owner(在第5行),它的值也是一个对象。我们把这个json放在http://www.jsonschema2pojo.org/ 网站左边的输入框中,右边的设置请按照图里的来。

1444873936917437.png

其中右边设置的Class name一项默认是Example,表示生成的对象名(最外层)就是Example,因为它无法从json中得知这到底是什么对象。我们这里期望得到的对象名是Repository,可以改成Repository就可以了,或者这里不改,在生成之后的java对象里改。

注意里面还有个owner,它本身也是对象,jsonschema2pojo能把这个对象也解析出来,而这个对象的类名耶就是Owner。

我们点击Preview按钮,在弹出的对话框中生成了两个类:

1444874333434965.png

第一个就是Owner,第二个截图没有显示出来,是Repository类(我把Class name改成了Repository)。

而这里的@Generated("org.jsonschema2pojo")可以直接删掉。

可以想象如此之多的变量如果自己写要花费多长时间。

不过需要注意的是jsonschema2pojo对json字符串的总长度有要求。这样如果你像比如github请求的是一个列表数据比如,那么你得到的json很可能超过长度限制。

比如我们使用github的搜索api发出一个这样的请求:https://api.github.com/search/repositories?q=tetris+language:assembly&sort=stars&order=desc

1444874793465130.png

返回的json数据首先打印的是列表长度total_count,这里是297。这是搜索结果的总长度,但是其实这次请求返回的只有30 条,因为这是第一页的数据。但是30条已经很长了,超过了长度限制。

要把这样的json转换成对象必须得找个搜索结果比较短的,我们换成https://api.github.com/search/repositories?q=codebox+language:java&sort=stars&order=desc

这个返回的结果只有9项,虽然也很长但是还是没有超过限制。

1444875495130089.png

直接把生成的结果复制到jsonschema2pojo的左侧输入框,把类名改成Repositories,表示这是一个数据集合。

生成的类结构从前面部分就能看出来了,分别是Repositories,Item以及Owner,其中Item对应的就是刚刚我们的Repository类,这里它只能根据json猜测这个类名是Item。

我们可以生成之后把Item改成Repository就行了。

我之所以再举一个搜索结果为列表的例子是为了验证一个列表式的json是否可以直接转换成java类。

注意

以上只是生成普通的对象,但是如果想让生成的类和retrofit一起使用并直接返回解析好了的Repositories对象,里面的类名保留为默认的才行。而且retrofit默认使用的是GsonConverter,因此在解析之前,最好把Annotation style设置成Gson。

1444961322463021.png

使用这种方式生成的java类会用注解的方式把json中的字段和类中的字段对应:@SerializedName("full_name")

@Expose

private String fullName;

这表示在json中字段名为full_name而在类中变量名为fullName。

这两个注解是gson的因此import com.google.gson.annotations.Expose;

import com.google.gson.annotations.SerializedName;

总结

可以看到jsonschema2pojo的实用性非常高。



推荐阅读
  • VScode格式化文档换行或不换行的设置方法
    本文介绍了在VScode中设置格式化文档换行或不换行的方法,包括使用插件和修改settings.json文件的内容。详细步骤为:找到settings.json文件,将其中的代码替换为指定的代码。 ... [详细]
  • 本文由编程笔记小编整理,主要介绍了使用Junit和黄瓜进行自动化测试中步骤缺失的问题。文章首先介绍了使用cucumber和Junit创建Runner类的代码,然后详细说明了黄瓜功能中的步骤和Steps类的实现。本文对于需要使用Junit和黄瓜进行自动化测试的开发者具有一定的参考价值。摘要长度:187字。 ... [详细]
  • 本文介绍了Java后台Jsonp处理方法及其应用场景。首先解释了Jsonp是一个非官方的协议,它允许在服务器端通过Script tags返回至客户端,并通过javascript callback的形式实现跨域访问。然后介绍了JSON系统开发方法,它是一种面向数据结构的分析和设计方法,以活动为中心,将一连串的活动顺序组合成一个完整的工作进程。接着给出了一个客户端示例代码,使用了jQuery的ajax方法请求一个Jsonp数据。 ... [详细]
  • 本文介绍了前端人员必须知道的三个问题,即前端都做哪些事、前端都需要哪些技术,以及前端的发展阶段。初级阶段包括HTML、CSS、JavaScript和jQuery的基础知识。进阶阶段涵盖了面向对象编程、响应式设计、Ajax、HTML5等新兴技术。高级阶段包括架构基础、模块化开发、预编译和前沿规范等内容。此外,还介绍了一些后端服务,如Node.js。 ... [详细]
  • SpringMVC接收请求参数的方式总结
    本文总结了在SpringMVC开发中处理控制器参数的各种方式,包括处理使用@RequestParam注解的参数、MultipartFile类型参数和Simple类型参数的RequestParamMethodArgumentResolver,处理@RequestBody注解的参数的RequestResponseBodyMethodProcessor,以及PathVariableMapMethodArgumentResol等子类。 ... [详细]
  • 在Android中解析Gson解析json数据是很方便快捷的,可以直接将json数据解析成java对象或者集合。使用Gson解析json成对象时,默认将json里对应字段的值解析到java对象里对应字段的属性里面。然而,当我们自己定义的java对象里的属性名与json里的字段名不一样时,我们可以使用@SerializedName注解来将对象里的属性跟json里字段对应值匹配起来。本文介绍了使用@SerializedName注解解析json数据的方法,并给出了具体的使用示例。 ... [详细]
  • Servlet多用户登录时HttpSession会话信息覆盖问题的解决方案
    本文讨论了在Servlet多用户登录时可能出现的HttpSession会话信息覆盖问题,并提供了解决方案。通过分析JSESSIONID的作用机制和编码方式,我们可以得出每个HttpSession对象都是通过客户端发送的唯一JSESSIONID来识别的,因此无需担心会话信息被覆盖的问题。需要注意的是,本文讨论的是多个客户端级别上的多用户登录,而非同一个浏览器级别上的多用户登录。 ... [详细]
  • 微信官方授权及获取OpenId的方法,服务器通过SpringBoot实现
    主要步骤:前端获取到code(wx.login),传入服务器服务器通过参数AppID和AppSecret访问官方接口,获取到OpenId ... [详细]
  • Apache Shiro 身份验证绕过漏洞 (CVE202011989) 详细解析及防范措施
    本文详细解析了Apache Shiro 身份验证绕过漏洞 (CVE202011989) 的原理和影响,并提供了相应的防范措施。Apache Shiro 是一个强大且易用的Java安全框架,常用于执行身份验证、授权、密码和会话管理。在Apache Shiro 1.5.3之前的版本中,与Spring控制器一起使用时,存在特制请求可能导致身份验证绕过的漏洞。本文还介绍了该漏洞的具体细节,并给出了防范该漏洞的建议措施。 ... [详细]
  • 在package.json中有如下两个对象:husky:{hooks:{pre-commit:lint-staged}},lint-staged:{src** ... [详细]
  • 原因:在vm上装7.9到sp3,打补丁到1644,再往后别打了,就打就打不开终端了,这个是java安全问题,以下只是终端的一些命令,记录一下:在系统下查看当前的串口:lsdev-C ... [详细]
  • 由于同源策略的限制,满足同源的脚本才可以获取资源。虽然这样有助于保障网络安全,但另一方面也限制了资源的使用。那么如何实现跨域呢,以下是实现跨域的一些方法。 ... [详细]
  • javascript二叉树基本功能实现
    都是常用的功能。删除是最复杂的。。test ... [详细]
  • PyTorch框架中有一个非常重要且好用的包:torchvision,该包主要由3个子包组成,分别是:torchvision.datasets、torchvision.models、torchv ... [详细]
  • 我创建了一个新的AWSSSO(使用内部IDP作为身份源,因此不使用ActiveDirectory)。我能够登录AWSCLI、AWSGUI,但 ... [详细]
author-avatar
tony2502877947
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有