首页 > 其他分享 >Gson解析Json实例

Gson解析Json实例

时间:2022-11-11 15:35:03浏览次数:75  
标签:return String void public Json 实例 import android Gson


       研究GSON花费了我一天的时间,期间出现了各种问题,第一次可以理解嘛,不过还好在安卓开发交流22群几位大神的帮助和我极大的耐心一下终于搞出来了,多谢几位大神,这里体现出了技术交流的重要性,一个人不可能所有技术都精通,懂得share,你的学识才能发扬光大,哈哈。下面进入一些理论知识:

一、Json理论知识

Json是一种类似于XML的通用数据交换格式,具有比XML更高的传输效率.
从结构上看,所有的数据(data)最终都可以分解成三种类型:
第一种类型是标量(scalar),也就是一个单独的字符串(string)或数字(numbers),比如"北京"这个单独的词。
第二种类型是序列(sequence),也就是若干个相关的数据按照一定顺序并列在一起,又叫做数组(array)或列表(List),比如"北京,上海"。
第三种类型是映射(mapping),也就是一个名/值对(Name/value),即数据有一个名称,还有一个与之相对应的值,这又称作散列(hash)或字典(dictionary),比如"首都:北京"。
Json的规格非常简单,只用一个页面几百个字就能说清楚,而且Douglas Crockford声称这个规格永远不必升级,因为该规定的都规定了。
1) 并列的数据之间用逗号(",")分隔。
2) 映射用冒号(":")表示。
3) 并列数据的集合(数组)用方括号("[]")表示。
4) 映射的集合(对象)用大括号("{}")表示。

我们以​​http://apistore.baidu.com/astore/serviceinfo/2003.html​​为例,官方给出的json数据如下例:

二、Json实例

JSON返回示例:
{
"errNum": 0,
"errMsg": "success",
"retData": {
"from": "en",
"to": "zh",
"dict_result": {
"word_name": "hello",
"symbols": [
{
"ph_am": "hɛˈlo, hə-",
"ph_en": "hə'ləʊ",
"parts": [
{
"part": "int.",
"means": [
"哈喽,喂",
"你好,您好",
"表示问候",
"打招呼"
]
},
{
"part": "n.",
"means": [
"“喂”的招呼声或问候声"
]
},
{
"part": "vi.",
"means": [
"喊“喂”"
]
}
]
}
]
}
}
}

看起来比较蛋疼吧,这玩意估计你用原始的JSONObject和JSONArray解析会让你蛋碎而且不利于以后维护,所以没办法,研究一下更科学的办法吧。

 

首先我们要定义bean:

分析一下有多少层:

Gson解析Json实例_Android

最后一层是个字符串数组,就不要写bean了,所以应该有五个。这里要注意哪个是对象,哪个是数组,不然肯定会报错:

Gson解析Json实例_Android_02

类似这种啊,提示IllegalStateException,话说怎么区分哪个是对象,哪个是数组呢?就这么理解打箭头的这些元素后面直接跟“[”(中括号)的就是数组,当然不直接跟中括号的就是对象,再定义bean的时候就有不同了,具体看下面的代码:

第一个bean:

package org.lxh.demo;

import java.util.List;

public class Status1 {
private int errNum;
private String errMsg;
RetData2 retData;//保证变量名与返回JSON的标签名一致,注意!!!!!!!!
@Override
public String toString() {
return "Status [errNum=" + errNum + ", errMsg=" + errMsg + ", retData="
+ retData + "]";
}
public int getErrNum() {
return errNum;
}
public void setErrNum(int errNum) {
this.errNum = errNum;
}
public String getErrMsg() {
return errMsg;
}
public void setErrMsg(String errMsg) {
this.errMsg = errMsg;
}
public RetData2 getRetData() {
return retData;
}
public void setRetData(RetData2 retData) {
this.retData = retData;
}






}

第二个bean:

package org.lxh.demo;

import java.util.List;

public class RetData2 {
private String from;
private String to;
DictResult3 dict_result;
public String getFrom() {
return from;
}
public void setFrom(String from) {
this.from = from;
}
public String getTo() {
return to;
}
public void setTo(String to) {
this.to = to;
}
public DictResult3 getDictResult() {
return dict_result;
}
public void setDictResult(DictResult3 dictResult) {
this.dict_result = dictResult;
}
@Override
public String toString() {
return "RetData [from=" + from + ", to=" + to + ", dictResult="
+ dict_result + "]";
}



}

第3个bean:

package org.lxh.demo;

import java.util.List;

public class DictResult3 {
private String word_name;

private List<Symbols> symbols;

public String getWord_name() {
return word_name;
}

public void setWord_name(String word_name) {
this.word_name = word_name;
}

public List<Symbols> getSymbols() {
return symbols;
}

public void setSymbols(List<Symbols> symbols) {
this.symbols = symbols;
}

@Override
public String toString() {
return "DictResult [word_name=" + word_name + ", symbols=" + symbols
+ "]";
}

}

第4个bean:

 

package org.lxh.demo;

import java.util.List;

public class Symbols {
private String ph_am;
private String ph_en;
private List<Parts> parts;

public String getPh_am() {
return ph_am;
}
public void setPh_am(String ph_am) {
this.ph_am = ph_am;
}
public String getPh_en() {
return ph_en;
}
public void setPh_en(String ph_en) {
this.ph_en = ph_en;
}
public List<Parts> getParts() {
return parts;
}
public void setParts(List<Parts> parts) {
this.parts = parts;
}
@Override
public String toString() {
return "Symbols [ph_am=" + ph_am + ", ph_en=" + ph_en + ", parts="
+ parts + "]";
}


}

第5个:

package org.lxh.demo;

import java.util.Arrays;
import java.util.List;

public class Parts {
private String part;
public String getParts() {
return part;
}
public void setParts(String parts) {
this.part = parts;
}
public String[] getMeans() {
return means;
}
public void setMeans(String[] means) {
this.means = means;
}
@Override
public String toString() {
return "Parts [parts=" + part + ", means=" + Arrays.toString(means)
+ "]";
}
String[] means;




}

 

以上写bean的时候又快捷方式,你不会不知道吧,你要是一个一个打,会把你累傻,什么快捷方式呢?比如第一个bean:

我们只要写:

private int errNum;
private String errMsg;
RetData2 retData;

这三行,然后选中他们点右键,选择Source 然后你就看到.....getter和setter方法,和什么什么tostring()了吧,这些都是可以帮你自动生成的。

上面写bean时最最重要的地方就是,定义的变量名,对象名和数组名一定要和json数据里的标签一模一样,不然一会解析数据的时候会因为找不到标签而返回null,那不就白忙活了。

接下面就是MainActivity了。

package org.lxh.demo;

import java.util.List;

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;

import com.android.volley.RequestQueue;
import com.android.volley.Response;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.StringRequest;
import com.android.volley.toolbox.Volley;
import com.google.gson.Gson;

public class MainActivity extends Activity {
private Button tojson;
RequestQueue mQueue;
StringRequest stringRequest;
Gson gson;
String str;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);

tojson = (Button) findViewById(R.id.toJson);
gson = new Gson();

mQueue = Volley.newRequestQueue(MainActivity.this);
// http://10.19.20.12/upgrade/test.txt是测试使用的json数据
stringRequest = new StringRequest(
"http://apistore.baidu.com/microservice/dictionary?query=hello&from=en&to=zh",
new Response.Listener<String>() {
public void onResponse(String response) {
Log.d("TAG", response);
System.out.println("response=" + response);
Status1 status = gson.fromJson(response, Status1.class);

System.out.println("错误码:" + status.getErrNum());
System.out.println("错误信息" + status.getErrMsg());
System.out.println("status=" + status);
System.out
.println("-------------------------------------");

RetData2 retData2 = status.getRetData();

System.out.println("from=" + retData2.getFrom());
DictResult3 dictResult3;
dictResult3 = retData2.getDictResult();
System.out.println("word_name="
+ dictResult3.getWord_name());

}
}, new Response.ErrorListener() {
public void one rrorResponse(VolleyError error) {
Log.e("TAG", error.getMessage(), error);
}

});

tojson.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
mQueue.add(stringRequest);
}
});
}

}

 

运行一下实例:看log窗口:

Gson解析Json实例_Android_03

注释:只是象征性的取了几个数啊,没有全部取出来,只是讲一下方法,你要那些数据,自己按照这个方法解析就好了。好了上面你还看到用到了Volley类,那么什么是Volley?

这里也顺便介绍一下吧:(下面介绍的文字是参考的)

三、Volley理论知识

我们平时在开发Android应用的时候不可避免地都需要用到网络技术,而多数情况下应用程序都会使用HTTP协议来发送和接收网络数据。Android系统中主要提供了两种方式来进行HTTP通信,HttpURLConnection和HttpClient,几乎在任何项目的代码中我们都能看到这两个类的身影,使用率非常高。

不过HttpURLConnection和HttpClient的用法还是稍微有些复杂的,如果不进行适当封装的话,很容易就会写出不少重复代码。于是乎,一些Android网络通信框架也就应运而生,比如说AsyncHttpClient,它把HTTP所有的通信细节全部封装在了内部,我们只需要简单调用几行代码就可以完成通信操作了。再比如Universal-Image-Loader,它使得在界面上显示网络图片的操作变得极度简单,开发者不用关心如何从网络上获取图片,也不用关心开启线程、回收图片资源等细节,Universal-Image-Loader已经把一切都做好了。

Android开发团队也是意识到了有必要将HTTP的通信操作再进行简单化,于是在2013年Google I/O大会上推出了一个新的网络通信框架——Volley。Volley可是说是把AsyncHttpClient和Universal-Image-Loader的优点集于了一身,既可以像AsyncHttpClient一样非常简单地进行HTTP通信,也可以像Universal-Image-Loader一样轻松加载网络上的图片。除了简单易用之外,Volley在性能方面也进行了大幅度的调整,它的设计目标就是非常适合去进行数据量不大,但通信频繁的网络操作,而对于大数据量的网络操作,比如说下载文件等,Volley的表现就会非常糟糕。

四、怎么用Volley

首先要下载一个jar包:

Gson解析Json实例_json_04

看名字百度下载吧。然后把包导进去,怎么导进去?百度吧,应该不难。

直接看代码你就知道怎么用了:

package org.lxh.demo;

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;

import com.android.volley.RequestQueue;
import com.android.volley.Response;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.StringRequest;
import com.android.volley.toolbox.Volley;

public class Hello extends Activity {

public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); // 生命周期方法
super.setContentView(R.layout.main); // 设置要使用的布局管理器
RequestQueue mQueue = Volley.newRequestQueue(Hello.this); //获取一个RequestQueue对象
StringRequest stringRequest = new StringRequest("http://www.baidu.com", //创建一个StringRequest对象
new Response.Listener<String>() {
public void onResponse(String response) {
Log.d("TAG", response);
}
}, new Response.ErrorListener() {
public void one rrorResponse(VolleyError error) {
Log.e("TAG", error.getMessage(), error);
}


});
mQueue.add(stringRequest); // 将这个StringRequest对象添加到RequestQueue里面

}
}

运行实例看Log窗口:

Gson解析Json实例_Android_05

 

返回的就是一个百度的Html数据。上面代码你就懂得了怎么获取Json数据的吧。


标签:return,String,void,public,Json,实例,import,android,Gson
From: https://blog.51cto.com/u_15866446/5845033

相关文章

  • ElasticSearch7.0实例精讲之第一章入门
    目录1、技术要求2、下载并安装Elasticserch3、设置网络4、设置节点5、设置linux系统6、设置不同的节点系统7、设置协调器节点8、设置采集节点9、在elasticsearch安装插件10......
  • 用实例带你了解 MySQL 全局锁
    MySQL全局锁会申请一个全局的读锁,对整个库加锁。全局锁的一般使用场景是:全局逻辑备份。全局锁的实现方式有两种://第一种方法Flushtableswithreadlock(FTWRL)//第二种方法......
  • ListView中排序和分组(GroupTemplate)的使用实例演示
    .aspx代码如下:<%@PageLanguage="C#"AutoEventWireup="true"CodeFile="8_Group_Sort.aspx.cs"Inherits="Group_Sort"%><!DOCTYPEhtmlPUBLIC"-//W3C//DTDXHTML1.0......
  • Android实战--解析稍复杂JSON数据DEMO
    废话不多说,直接上代码,布局文件:<?xmlversion="1.0"encoding="utf-8"?><LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"android:layout_wid......
  • fastjson1.2.47rce
    漏洞产生原因fastjson于1.2.24版本后增加了反序列化白名单,而在1.2.48以前的版本中,攻击者可以利用特殊构造的json字符串绕过白名单检测,成功执行任意命令。  环境搭建......
  • Session和Application实现网络在线聊天室实例
    login.aspx代码如下:<%@PageLanguage="C#"AutoEventWireup="true"CodeFile="Sample_chat_login.aspx.cs"Inherits="Sample_chart_login"%><!DOCTYPEhtmlPUBLIC"-//......
  • intent跳转时添加动画效果实例
    系统默认的intent跳转效果非常生硬,丑陋,影响用户体验,怎么添加跳转动画呢?首先新建两个动画文件:zoomin.xml:<?xmlversion="1.0"encoding="utf-8"?><setxmlns:android="htt......
  • 学习笔记-RPC远程调用概念和实例
    RPC远程调用概念和实例一定要注意顺序,先hook,然后invoke,再rpc逆向三段:第三段RPC:RemoteProcedureCall远程调用FRIDA精髓:远程调动frida(rpc)多主机多手机多端口......
  • JetBrains Rider Enabling JSON5
    JetBrains RiderrecognizesanumberofmostpopularJSONstandardsincluding JSON5.JetBrains Riderbydefaulttreatsfileswiththe json5 extensionasJS......
  • Visual Studio 2022 升级 WorkloadManifest.json冲突,导致.NET 6项目无法加载
    .NET7的发布,升级VisualStudio2022的17.4版本,然后无法打开所有解决方案。提示信息如下异常:SDK解析程序失败:"尝试解析SDK"Microsoft.NET.Sdk"时,SDK解析程序”Microsoft.D......