JSON三种数据解析方法

文章目录

    • 一、什么是JSON数据?
    • 二、JSON解析方法
      • 2.1、原生解析
      • 2.2、Gson解析
      • 2.3、FastJson解析
    • 四、总结


在这里插入图片描述

一、什么是JSON数据?

先看下面,这里有一段JSON数据,我们根据这段数进行讲解:

{"paramz": {"feeds": [{"id": 299076,"oid": 288340,"category": "article","data": {"subject": "荔枝新闻3.0:不止是阅读","summary": "江苏广电旗下资讯类手机应用“荔枝新闻”于近期推出全新升级换代的3.0版。","cover": "/Attachs/Article/288340/3e8e2c397c70469f8845fad73aa38165_padmini.JPG","pic": "","format": "txt","changed": "2015-09-22 16:01:41"}}],"PageIndex": 1,"PageSize": 20,"TotalCount": 53521,"TotalPage": 2677}
}

其实JSON数据就是一段字符串而已,只不过有不同意义的分隔符将其分割开来而已,我们看上面的符号,里面有[] ,{}等符号,其中

  • []: 中括号代表的是一个数组;
  • -{}: 大括号代表的是一个对象
  • "": 表示的是属性值
  • :: 代表的是前后之间的关系,冒号前面是属性的名称,后面是属性的值,这个值可以是基本数据类型,也可以是引用数据类型。

二、JSON解析方法

2.1、原生解析

JSONObject系统自带的解析方式解析,我们先来JSONObject(系统自带的类)类中的方法:

img

上面用红框框出来的是我们手动解析最常用的方法了,好了,现在我们想要解析上面的一段数据,该怎么做呢?这里我写了一个解析类如下

public class JsonUtils {/*** 根据json数据解析返回一个List<HashMap<String, Object>>集合* @param json  json数据* @return*/public static List<HashMap<String, Object>> getJsonList(String json) {List<HashMap<String, Object>> dataList;dataList = new ArrayList<>();try {JSONObject rootObject = new JSONObject(json);JSONObject paramzObject = rootObject.getJSONObject("paramz");JSONArray feedsArray = paramzObject.getJSONArray("feeds");for (int i = 0; i < feedsArray.length(); i++) {JSONObject sonObject = feedsArray.getJSONObject(i);JSONObject dataObject = sonObject.getJSONObject("data");String subjectStr = dataObject.getString("subject");String summaryStr = dataObject.getString("summary");String coverStr = dataObject.getString("cover");HashMap<String, Object> map = new HashMap<>();map.put("subject", subjectStr);map.put("summary", summaryStr);map.put("cover", coverStr);dataList.add(map);}return dataList;} catch (JSONException e) {e.printStackTrace();}return null;}
}

相信很简单一看就懂了吧,此方法写起来主要是比较费时间罢了,无非就是几个方法不停的调用而已,所以显得特别的费时费力,下面我又写了一个解析的方法,方法中会有一些冗余的代码,是为了更加深刻理解JSON解析而写的,实际中可以删掉,也用了一行GSON解析,GSON解析下面会见讲到:

其中DataModel对象我是将data对象使用GsonFormat插件工具生成的,使用方式可以自行搜索

public class DataModel {/*** subject : "荔枝新闻3.0:不止是阅读"* summary : "江苏广电旗下资讯类手机应用“荔枝新闻”于近期推出全新升级换代的3.0版。"* cover : "/Attachs/Article/288340/3e8e2c397c70469f8845fad73aa38165_padmini.JPG"* pic :* format : video* changed : 2015-11-07 14:35:22*/public String subject;public String summary;public String cover;public String pic;public String format;public String changed;@Overridepublic String toString() {return "DataModel{" +"subject='" + subject + '\'' +", summary='" + summary + '\'' +", cover='" + cover + '\'' +", pic='" + pic + '\'' +", format='" + format + '\'' +", changed='" + changed + '\'' +'}';}
}
 /*** 根据json对象获取List<DataModel>集合* @param json 数据* @return*/public static List<DataModel> getGsonList(String json) {List<DataModel> dataList;try {JSONObject rootObject = new JSONObject(json);JSONObject paramzObject = rootObject.getJSONObject("paramz");/*** JSONArray的构造方法获取JSONArray对象*/JSONArray jsonArray = new JSONArray(paramzObject.getString("feeds"));Log.i(TAG, "jsonarray.length():"+jsonArray.length());/*** 获取JSONObject对象的属性关键字*/Iterator<String> iterators = paramzObject.keys();while (iterators.hasNext()) {Log.i(TAG, "iterators: " + iterators.next());}JSONArray feeds = paramzObject.getJSONArray("feeds");dataList = new ArrayList<>();for (int i = 0; i < feeds.length(); i++) {JSONObject jsonObject = feeds.getJSONObject(i);DataModel model = new Gson().fromJson(jsonObject.getString("data"), new TypeToken<DataModel>() {}.getType());Log.i(TAG, "DataModel: " + model.toString());dataList.add(model);}return dataList;} catch (JSONException e) {// TODO Auto-generated catch blocke.printStackTrace();}return null;}

1、对于JSONObject对象来说,想要得到一个JSONObject对象通常可以通过

JSONObject(String json)-> JSONObject rootObject = new JSONObject(json);
JSONObject getJSONObject(String name){}-> JSONObject paramzObject = rootObject.getJSONObject(“paramz”);

2、对于JSONArray对象来说,想要得到一个JSONArray对象通常可以通过

JSONArray(String json)->JSONArray jsonArray = new JSONArray(paramzObject.getString(“feeds”));
JSONObject getJSONObject(String name){}-> JSONArray feeds = paramzObject.getJSONArray(“feeds”);

2.2、Gson解析

我们如果懂得了上面的手动解析方式的话,那么对于Gson解析而言,就太简单了,下面我们就开始解析下面一段JSON数据:

{"homeadlist": [{"id": 1,"imgurl": "/img/homead/a73b3f1d-0f14-429d-9d0f-70643fb0f0eb.jpg","jumpflag": 0,"jumpurl": "","posflag": 1,"remark": "1111","cityid": 1},{"id": 12,"imgurl": "/img/homead/eb442fbf-49db-4ba6-a102-d781505f426d.jpg","jumpflag": 0,"jumpurl": "","posflag": 2,"remark": "","cityid": 1},{"id": 14,"imgurl": "/img/homead/68109460-635d-4c5c-8be8-64d7c7889d18.jpg","jumpflag": 0,"jumpurl": "http://shiranlife.kuaizhan.com/","posflag": 4,"remark": "","cityid": 1}]
}

首先我们使用GsonFormat工具生成一个类HomeadListModel:

public class HomeadListModel {/*** code : 1* data : {"homeadlist":[{"id":1,"imgurl":"/img/homead/a73b3f1d-0f14-429d-9d0f-70643fb0f0eb.jpg","jumpflag":0,"jumpurl":"","posflag":1,"remark":"1111","cityid":1},{"id":12,"imgurl":"/img/homead/eb442fbf-49db-4ba6-a102-d781505f426d.jpg","jumpflag":0,"jumpurl":"","posflag":2,"remark":"","cityid":1},{"id":14,"imgurl":"/img/homead/68109460-635d-4c5c-8be8-64d7c7889d18.jpg","jumpflag":0,"jumpurl":"http://shiranlife.kuaizhan.com/","posflag":4,"remark":"","cityid":1}]}*/public int code;public DataBean data;public static class DataBean {public List<HomeadlistBean> homeadlist;public static class HomeadlistBean {public int id;public String imgurl;public int jumpflag;public String jumpurl;public int posflag;public String remark;public int cityid;}}
}

我们使用OKHttpClient,代码如下

OkHttpClient.Builder builder = new OkHttpClient.Builder();Request request = new Request.Builder().url(url).get().build();builder.build().newCall(request).enqueue(new Callback() {@Overridepublic void onFailure(Call call, IOException e) {}@Overridepublic void onResponse(Call call, Response response) throws IOException {Gson gson = new Gson();/*** java.lang.IllegalStateException: closed* 因为OkHttp请求回调中response.body().string()只能有效调用一次**/String string = response.body().string();Log.i("aaa", "response: " + string);/*** 重新构建一个response 因为response.body().string()调用一次之后流就断掉了,只能有效调用一次*/MediaType mediaType = response.body().contentType();Response response1 = response.newBuilder().body(ResponseBody.create(mediaType, string)).build();String string1 = response1.body().string();Log.i("aaa", "response1: " + string1);/*** 将json数据转换为对象*/HomeadListModel model = gson.fromJson(string1, HomeadListModel.class);//HomeadListModel model2 = gson.fromJson(string1, new TypeToken<HomeadListModel>() {}.getType());/*** 将对象转换为json数据*/String jsonString = gson.toJson(model);Log.i("aaa", "onResponse2: " + jsonString);for (HomeadListModel.DataBean.HomeadlistBean data : model.data.homeadlist) {mData.add(imageUrl + data.imgurl);}runOnUiThread(new Runnable() {@Overridepublic void run() {mAdapter.notifyDataSetChanged();}});}});

我们想要将一个json数据转换为对象的话需要使用fromJson(String json, Class classOfT) /fromJson(String json, Type typeOfT),当我们需要将对象转换为String的时候根据String toJson(Object src)方法即可。这里需要注意一点,如果response.body().string()调用大于一次的话,就会报错java.lang.IllegalStateException: closed,因为response.body().string()调用一次之后流就断掉了,需要重新构建一个response;

2.3、FastJson解析

这个解析和Gson解析差不多,也是一行就搞定了,也是对上面的Gson数据进行解析,想要将json数据解析成对象需要使用 parseObject()方法,参数可以传Class,也可以传Type;当需要通过对象得到String字符串时候使用String json1 = JSONObject.toJSONString(model)即可,下面贴上代码

OkHttpClient.Builder builder = new OkHttpClient.Builder();Request request = new Request.Builder().url(url).get().build();builder.build().newCall(request).enqueue(new Callback() {@Overridepublic void onFailure(Call call, IOException e) {}@Overridepublic void onResponse(Call call, Response response) throws IOException {String json = response.body().string();/*** 根据json数据获取对象*/HomeadListModel model = JSONObject.parseObject(json, new TypeToken<HomeadListModel>() {}.getType());
//                HomeadListModel model2 = JSONObject.parseObject(json, HomeadListModel.class);/*** 根据对象获取json数据*/String json1 = JSONObject.toJSONString(model);Log.i("aaa", "fastJson: " + json1);for (HomeadListModel.DataBean.HomeadlistBean data : model.data.homeadlist) {mData.add(imageUrl + data.imgurl);}runOnUiThread(new Runnable() {@Overridepublic void run() {mAdapter.notifyDataSetChanged();}});}});

四、总结

上面写了三种解析JSON数据的方法,第一种是最麻烦的,但是不一定是最差的,后面两种Gson和FastJson都是最常用的方法。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/806629.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

springboot+vue全栈开发【1.准备工作篇】

目录 前言环境配置关于Maven 前言 为了坚持每天写博客所以开了这个系列~~ 环境配置 1.配置java环境&#xff0c;下载jdk&#xff0c;配置环境变量 这一步有很多教程&#xff0c;不赘述了 2.安装idea 关于Maven Maven是一个项目管理工具&#xff0c;可以对java项目进行自动化…

Harmony与Android项目结构对比

主要文件对应 Android文件HarmonyOS文件清单文件AndroidManifest.xmlmodule.json5Activity/Fragmententryability下的ts文件XML布局pages下的ets文件resresourcesModule下的build.gradleModule下的build-profile.json5gradlehvigor根目录下的build.gradle根目录下的build-profi…

Linux——fork复制进程

1)shell: 在计算机科学中&#xff0c;Shell俗称壳&#xff08;用来区别于核&#xff09;&#xff0c;是指“为使用者提供操作界面”的软件&#xff08;command interpreter&#xff0c;命令解析器&#xff09;。它类似于DOS下的COMMAND.COM和后来的cmd.exe。它接收用户命令&…

【Locust分布式压力测试】

Locust分布式压力测试 https://docs.locust.io/en/stable/running-distributed.html Distributed load generation A single process running Locust can simulate a reasonably high throughput. For a simple test plan and small payloads it can make more than a thousan…

30岁《爱·回家》小花多次得罪高层,正式宣布离巢TVB。

30岁的苏韵姿&#xff08;Andrea&#xff09;16年选港姐入行&#xff0c;虽然无三甲名次&#xff0c;但靠着皇后大学戏剧学士学位背景&#xff0c;她很快已有机会入剧组&#xff0c;凭《爱回家之开心速递》熊心如&#xff08;红衫鱼&#xff09;一角成功入屋&#xff0c;不过去…

Mongodb入门--头歌实验MongoDB 数据库基本操作

一、数据库创建 任务描述 本关任务&#xff1a;创建数据库。 相关知识 本关评测是在 Linux 环境下进行的&#xff0c;MongoDB 的安装与配置测评系统均已默认完成。 为了完成本关任务&#xff0c;你需要掌握&#xff1a; 1.如何连接数据库&#xff1b; 2.如何创建数据库。 连接数…

双云及多云融合(混合云)

背景&#xff1a;客户对于业务的高可用需求&#xff0c;当发生故障时&#xff0c;业务还能正常使用&#xff0c;如某云机房整体宕机&#xff0c;或云管理服务整体宕掉&#xff0c;导致客户业务不可用&#xff0c;此时&#xff0c;需有业务能顺利切换到灾备云上。 需求&#xf…

[蓝桥杯 2018 国 C] 迷宫与陷阱

题目&#xff1a; 思路&#xff1a; 代码&#xff1a; #include <bits/stdc.h> using namespace std; const int N1e310; char g[N][N];//输入&#xff1a;图的数组 int vis[N][N]; /* 剪枝&#xff1a;记录magic的个数&#xff08;一个点经过两次&#xff0c;magic越大…

【讲解下如何从零基础学习Java】

&#x1f3a5;博主&#xff1a;程序员不想YY啊 &#x1f4ab;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f917;点赞&#x1f388;收藏⭐再看&#x1f4ab;养成习惯 ✨希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出…

设计模式学习笔记 - 设计模式与范式 -行为型:9.迭代器模式(上):相比直接遍历集合数据,使用迭代器模式有哪些优势?

概述 上篇文章&#xff0c;我们学习了状态模式。状态模式是状态机的一种实现方式。它通过将事件触发的状态转移和动作执行&#xff0c;拆分到不同的状态类中&#xff0c;以此来避免状态机类中的分支判断逻辑&#xff0c;应对状态机类代码的复杂性。 本章&#xff0c;学习另外…

Dude, where’s that IP? Circumventing measurement-based IP geolocation(2010年)

下载地址:https://www.usenix.org/legacy/event/sec10/tech/full_papers/Gill.pdf 被引次数:102 Gill P, Ganjali Y, Wong B. Dude, Wheres That {IP}? Circumventing Measurement-based {IP} Geolocation[C]//19th USENIX Security Symposium (USENIX Security 10). 2010.…

day55 最长递增子序列 最长连续递增子序列 最长重复子数组

题目1 300 最长递增子序列 题目链接 300 最长递增子序列 题意 找到整数数组nums的最长严格递增子序列的长度&#xff08;子序列并不改变原始的顺序&#xff0c;但是可以删除元素&#xff09; 动态规划 动规五部曲 1&#xff09;dp数组及下标i的含义 dp[i] 表示以nums[i…

dnspy逆向和de4dot脱壳

拿到一个软件&#xff0c;使用dnspy查看&#xff0c;发现反汇编后关键部分的函数名和代码有很多乱码&#xff1a; 这样的函数非常多&#xff0c;要想进一步调试和逆向&#xff0c;就只能在dnspy中看反汇编代码了&#xff0c;而无法看到c#代码&#xff0c;当时的整个逆向过程只剩…

遥感图像处理:从畸变消除到专题信息提取

​ ​ ​在遥感技术的应用中&#xff0c;图像处理是不可或缺的关键步骤。从消除各种辐射畸变和几何畸变&#xff0c;到利用增强技术突出景物的光谱和空间特征&#xff0c;再到进一步理解、分析和判别处理后的图像&#xff0c;这一过程为我们呈现了一幅幅更为真实、清晰的…

免费ssl证书能一直续签吗?如何获取SSL免费证书?

免费SSL证书是否可以一直续签。我们需要了解SSL证书的基本工作原理。当你访问一个使用HTTPS协议的网站时&#xff0c;该网站实际上在使用一个SSL证书。这个证书相当于一个数字身份证明&#xff0c;它验证了网站的真实性和安全性。而这个证明是由受信任的第三方机构——通常是证…

被控平台的远程控制软件:功能、应用与安全性考量

随着信息技术的迅猛发展&#xff0c;远程控制软件在多个领域中的应用日益广泛。这类软件允许用户通过网络远程访问和控制另一台计算机或设备&#xff0c;为工作、学习和生活带来了极大的便利。然而&#xff0c;这种技术同样伴随着安全风险&#xff0c;特别是在被控平台方面。 K…

Harmony鸿蒙南向驱动开发-MIPI DSI

功能简介 DSI&#xff08;Display Serial Interface&#xff09;是由移动行业处理器接口联盟&#xff08;Mobile Industry Processor Interface (MIPI) Alliance&#xff09;制定的规范&#xff0c;旨在降低移动设备中显示控制器的成本。它以串行的方式发送像素数据或指令给外…

AI论文速读 | TF-LLM:基于大语言模型可解释性的交通预测

论文标题&#xff1a; Explainable Traffic Flow Prediction with Large Language Models 作者&#xff1a;Xusen Guo, Qiming Zhang, Mingxing Peng, Meixin Zhu(朱美新)*, Hao (Frank)Yang(杨昊) 机构&#xff1a;香港科技大学&#xff08;广州&#xff09;&#xff0c;约翰…

Fast-Planner(五)详解TopologyPRM

本文上接Fast-Planner第一篇文章的内容&#xff0c;本文主要详解这一系列的第二篇Robust Real-time UAV Replanning Using Guided Gradient-based Optimization and Topological Paths中的TopologyPRM即其代码。如有问题&#xff0c;欢迎各位大佬评论指出&#xff0c;带着我一起…

未设置超时时间导致线程池资源耗尽,排查过程

错误分析&#xff1a; Scheduled进行定时任务的时候&#xff0c;spring会创建一个线程&#xff0c;然后用这个线程来执行任务&#xff0c;如果这个任务阻塞了&#xff0c;那么这个任务就会停滞&#xff0c;出现不执行的情况。而使用原生的方法进行http请求时&#xff0c;如果不…