json解析数据详解

article/2025/11/10 23:04:39

对于服务器端来说,返回给客户端的数据格式一般分为html、xml和json这三种格式,那么本篇随笔将讲解一下json这个知识点,包括如何通过json-lib和gson这两个json解析库来对解析我们的json数据,以及如何在我们的Android客户端解析来自服务器端的json数据,并更新到UI当中。

一、什么是json

json(Javascript Object Notation)是一种轻量级的数据交换格式,相比于xml这种数据交换格式来说,因为解析xml比较的复杂,而且需要编写大段的代码,所以客户端和服务器的数据交换格式往往通过json来进行交换。尤其是对于web开发来说,json数据格式在客户端直接可以通过javascript来进行解析。

json一共有两种数据结构,一种是以 (key/value)对形式存在的无序的jsonObject对象,一个对象以“{”(左花括号)开始,“}”(右花括号)结束。每个“名称”后跟一个“:”(冒号);“‘名称/值’ 对”之间使用“,”(逗号)分隔。

例如:{"name": "xiaoluo"}, 这就是一个最简单的json对象,对于这种数据格式,key值必须要是string类型,而对于value,则可以是string、number、object、array等数据类型:

另一种数据格式就是有序的value的集合,这种形式被称为是jsonArray,数组是值(value)的有序集合。一个数组以“[”(左中括号)开始,“]”(右中括号)结束。值之间使用“,”(逗号)分隔。

 

更多的有关json数据格式可以参加json的官网,http://www.json.org/json-zh.html

二、解析json数据格式

这里将使用两种json的解析库来对我们的json数据格式进行解析以及生成我们的json数据格式。

1.json-lib(http://json-lib.sourceforge.net/)

使用json-lib来进行解析,我们需要引入第三方的包,因为json-lib分为了两个版本,一个版本是针对于jdk1.3的,一个版本是针对于jdk1.5的,这里我们下载jdk1.5的这个json-lib包,其中还需要引入其他的几个jar包:

下载好这几个jar包后,加入到classpath中即可。我们来看看json-lib给我们提供的API。

我们最常用的两个类就是  JSONObject和JSONArray这两个类,分别代表了json对象和json数组,这两个类都实现了 JSON 这个接口,下面我们通过几个小例子来看看如何将我们常见的几种数据格式转换成我们的json对象(我们一般称之为JSON数据的序列化)以及再将json对象在转换成我们的数据格式(称之为反序列化)。

①简单的javabean的序列化和反序列化

复制代码
public class Person
{private int id;private String name;private String address;public Person(){}public int getId(){return id;}public void setId(int id){this.id = id;}public String getName(){return name;}public void setName(String name){this.name = name;}public String getAddress(){return address;}public void setAddress(String address){this.address = address;}public Person(int id, String name, String address){super();this.id = id;this.name = name;this.address = address;}@Overridepublic String toString(){return "Person [id=" + id + ", name=" + name + ", address=" + address+ "]";}}
复制代码

首先我们定义一个简单的javabean对象,然后将一个Person对象转换成json对象,然后再将这个json对象反序列化成我们的Person对象。

我们先定义一个JsonTools类,这个类有两个静态方法,我们可以通过这两个方法来得到一个JSON类型的字符串对象,以及一个JSON对象

复制代码
public class JsonTools
{/*** 得到一个json类型的字符串对象* @param key* @param value* @return*/public static String getJsonString(String key, Object value){JSONObject jsonObject = new JSONObject();//put和element都是往JSONObject对象中放入 key/value 对
//        jsonObject.put(key, value);
        jsonObject.element(key, value);return jsonObject.toString();}/*** 得到一个json对象* @param key* @param value* @return*/public static JSONObject getJsonObject(String key, Object value){JSONObject jsonObject = new JSONObject();jsonObject.put(key, value);return jsonObject;}}
复制代码

我们可以直接通过 JSONObject jsonObject = new JSONObject(); 这个方法就可以得到一个json对象,然后通过element()或者是put()方法来给我们的json对象添加key/value对。我们先来看看第一个例子,实现一个简单的Person对象和json对象的转换

     Person person = new Person(1, "xiaoluo", "广州");//    将Person对象转换成一个json类型的字符串对象String personString = JsonTools.getJsonString("person", person);System.out.println(personString.toString());

我们看看控制台的输出:

{"person":{"address":"广州","id":1,"name":"xiaoluo"}}

整个外面的大括号是一个json对象,里面有一对key/value,其中里面的{"address":"广州","id":1,"name":"xiaoluo"}就是我们转换成的json字符串对象

再来看看如何将json对象转换成我们的bean对象

     JSONObject jsonObject = JsonTools.getJsonObject("person", person);//    通过JSONObject的toBean方法可以将json对象转换成一个javabeanJSONObject personObject = jsonObject.getJSONObject("person");Person person2 = (Person) JSONObject.toBean(personObject, Person.class);System.out.println(person2);
Person [id=1, name=xiaoluo, address=广州]

②转换List<Person>类型的对象

复制代码
  @Testpublic void testPersonsJson(){List<Person> persons = new ArrayList<Person>();Person person = new Person(1, "xiaoluo", "广州");Person person2 = new Person(2, "android", "上海");persons.add(person);persons.add(person2);String personsString = JsonTools.getJsonString("persons", persons);System.out.println(personsString);JSONObject jsonObject = JsonTools.getJsonObject("persons", persons);//    List<Person>相当于一个JSONArray对象JSONArray personsArray = (JSONArray)jsonObject.getJSONArray("persons");List<Person> persons2 = (List<Person>) personsArray.toCollection(personsArray, Person.class);System.out.println(persons2);}
复制代码
{"persons":[{"address":"广州","id":1,"name":"xiaoluo"},{"address":"上海","id":2,"name":"android"}]}
[Person [id=1, name=xiaoluo, address=广州], Person [id=2, name=android, address=上海]]

③List<Map<String, String>>类型的json对象转换

复制代码
   @Testpublic void testMapJson(){List<Map<String, String>> list = new ArrayList<Map<String, String>>();Map<String, String> map1 = new HashMap<String, String>();map1.put("id", "001");map1.put("name", "xiaoluo");map1.put("age", "20");Map<String, String> map2 = new HashMap<String, String>();map2.put("id", "002");map2.put("name", "android");map2.put("age", "33");list.add(map1);list.add(map2);String listString = JsonTools.getJsonString("list", list);System.out.println(listString);JSONObject jsonObject = JsonTools.getJsonObject("list", list);JSONArray listArray = jsonObject.getJSONArray("list");List<Map<String, String>> list2 = (List<Map<String, String>>) listArray.toCollection(listArray, Map.class);System.out.println(list2);}
复制代码
{"list":[{"id":"001","age":"20","name":"xiaoluo"},{"id":"002","age":"33","name":"android"}]}
[{id=001, name=xiaoluo, age=20}, {id=002, name=android, age=33}]

通过上面的例子,我们可以了解了如何通过json-lib这个解析库来实现javabean、List、Map等数据和json数据的互相转换

2.gson(http://code.google.com/p/google-gson/)

下面我们来看看Google提供的gson这个json解析库,同样我们需要去下载gson这个jar包,导入到我们的项目中

使用gson,我们可以非常轻松的实现数据对象和json对象的相互转化,其中我们最常用的就是两个方法,一个是fromJSON(),将json对象转换成我们需要的数据对象,另一个是toJSON(),这个就是将我们的数据对象转换成json对象。下面我们也通过一个综合的例子来看看gson的使用方法:

复制代码
public class JsonService
{public Person getPerson(){Person person = new Person(1, "xiaoluo", "广州");return person;}public List<Person> getPersons(){List<Person> persons = new ArrayList<Person>();Person person = new Person(1, "xiaoluo", "广州");Person person2 = new Person(2, "android", "上海");persons.add(person);persons.add(person2);return persons;}public List<String> getString(){List<String> list = new ArrayList<String>();list.add("广州");list.add("上海");list.add("北京");return list;}public List<Map<String, String>> getMapList(){List<Map<String, String>> list = new ArrayList<Map<String, String>>();Map<String, String> map1 = new HashMap<String, String>();map1.put("id", "001");map1.put("name", "xiaoluo");map1.put("age", "20");Map<String, String> map2 = new HashMap<String, String>();map2.put("id", "002");map2.put("name", "android");map2.put("age", "33");list.add(map1);list.add(map2);return list;}
}
复制代码
复制代码
public static void main(String[] args){Gson gson = new Gson();JsonService jsonService = new JsonService();Person person = jsonService.getPerson();System.out.println("person: " + gson.toJson(person));//    对于Object类型,使用 fromJson(String, Class)方法来将Json对象转换成Java对象Person person2 = gson.fromJson(gson.toJson(person), Person.class);System.out.println(person2);System.out.println("------------------------------------------------");List<Person> persons = jsonService.getPersons();System.out.println("persons: " + gson.toJson(persons));/** 对于泛型对象,使用fromJson(String, Type)方法来将Json对象转换成对应的泛型对象* new TypeToken<>(){}.getType()方法*/List<Person> persons2 = gson.fromJson(gson.toJson(persons), new TypeToken<List<Person>>(){}.getType());System.out.println(persons2);System.out.println("------------------------------------------------");List<String> list = jsonService.getString();System.out.println("String---->" + gson.toJson(list));List<String> list2 = gson.fromJson(gson.toJson(list), new TypeToken<List<String>>(){}.getType());System.out.println("list2---->" + list2);System.out.println("------------------------------------------------");List<Map<String, String>> listMap = jsonService.getMapList();System.out.println("Map---->" + gson.toJson(listMap));List<Map<String, String>> listMap2 = gson.fromJson(gson.toJson(listMap), new TypeToken<List<Map<String, String>>>(){}.getType());System.out.println("listMap2---->" + listMap2);System.out.println("------------------------------------------------");}
复制代码

看看控制台的输出:

复制代码
person: {"id":1,"name":"xiaoluo","address":"广州"}
Person [id=1, name=xiaoluo, address=广州]
------------------------------------------------
persons: [{"id":1,"name":"xiaoluo","address":"广州"},{"id":2,"name":"android","address":"上海"}]
[Person [id=1, name=xiaoluo, address=广州], Person [id=2, name=android, address=上海]]
------------------------------------------------
String---->["广州","上海","北京"]
list2---->[广州, 上海, 北京]
------------------------------------------------
Map---->[{"id":"001","age":"20","name":"xiaoluo"},{"id":"002","age":"33","name":"android"}]
listMap2---->[{id=001, age=20, name=xiaoluo}, {id=002, age=33, name=android}]
------------------------------------------------
复制代码

三、在Android客户端解析服务器端的json数据

下面我们来完成一个综合的例子,Android客户端通过一个AsyncTask异步任务请求服务器端的某些数据,然后在解析完这些数据后,将得到的数据内容更新到我们的Spinner这个UI控件当中。

我们首先来看下服务器端的代码:

复制代码
@WebServlet("/CityServlet")
public class CityServlet extends HttpServlet
{private static final long serialVersionUID = 1L;public CityServlet(){super();}protected void doGet(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException{this.doPost(request, response);}protected void doPost(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException{response.setContentType("text/html;charset=utf-8");request.setCharacterEncoding("utf-8");response.setCharacterEncoding("utf-8");PrintWriter writer = response.getWriter();String type = request.getParameter("type");if("json".equals(type)){List<String> cities = new ArrayList<String>();cities.add("广州");cities.add("上海");cities.add("北京");cities.add("湖南");Map<String, List<String>> map = new HashMap<String, List<String>>();map.put("cities", cities);String citiesString = JSON.toJSONString(map);writer.println(citiesString);}writer.flush();writer.close();}}
复制代码

如果客户端请求的参数是type=json,则响应给客户端一个json数据格式

接着来看看客户端的代码,首先看看客户端的布局文件,其实就是一个按钮和一个Spinner控件,当点击按钮后,通过http协议请求服务器端的数据,然后在接收到后再更新我们的Spinner控件的数据

复制代码
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent" ><TextViewandroid:id="@+id/textView1"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_alignParentLeft="true"android:layout_alignParentTop="true"android:layout_marginLeft="64dp"android:layout_marginTop="64dp"android:textSize="20sp"android:text="城市" /><Spinner android:id="@+id/spinner"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_alignTop="@id/textView1"android:layout_toRightOf="@id/textView1"/><Buttonandroid:id="@+id/button"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_alignLeft="@+id/textView1"android:layout_below="@+id/spinner"android:layout_marginLeft="22dp"android:layout_marginTop="130dp"android:text="加载数据" /></RelativeLayout>
复制代码

在Android客户端写一个解析json数据格式的类:

复制代码
public class JsonUtils
{/*** @param citiesString    从服务器端得到的JSON字符串数据* @return    解析JSON字符串数据,放入List当中*/public static List<String> parseCities(String citiesString){List<String> cities = new ArrayList<String>();try{JSONObject jsonObject = new JSONObject(citiesString);JSONArray jsonArray = jsonObject.getJSONArray("cities");for(int i = 0; i < jsonArray.length(); i++){cities.add(jsonArray.getString(i));}}catch (Exception e){e.printStackTrace();}return cities;}
}
复制代码

当然我们的HttpUtils类也不可少:

复制代码
public class HttpUtils
{/*** @param path    请求的服务器URL地址* @param encode    编码格式* @return    将服务器端返回的数据转换成String*/public static String sendPostMessage(String path, String encode){String result = "";HttpClient httpClient = new DefaultHttpClient();try{HttpPost httpPost = new HttpPost(path);HttpResponse httpResponse = httpClient.execute(httpPost);if(httpResponse.getStatusLine().getStatusCode() == HttpStatus.SC_OK){HttpEntity httpEntity = httpResponse.getEntity();if(httpEntity != null){result = EntityUtils.toString(httpEntity, encode);}}}catch (Exception e){e.printStackTrace();}finally{httpClient.getConnectionManager().shutdown();}return result;}
}
复制代码

最后来看看我们的MainActivity类:

复制代码
public class MainActivity extends Activity
{private Spinner spinner;private Button button;private ArrayAdapter<String> adapter;private ProgressDialog dialog;private final String CITY_PATH_JSON = "http://172.25.152.34:8080/httptest/CityServlet?type=json";@Overrideprotected void onCreate(Bundle savedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);spinner = (Spinner)findViewById(R.id.spinner);button = (Button)findViewById(R.id.button);dialog = new ProgressDialog(MainActivity.this);button.setOnClickListener(new OnClickListener(){@Overridepublic void onClick(View v){dialog.setTitle("提示信息");dialog.setMessage("loading......");dialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);dialog.setCancelable(false);new MyAsyncTask().execute(CITY_PATH_JSON);}});}public class MyAsyncTask extends AsyncTask<String, Void, List<String>>{@Overrideprotected void onPreExecute(){dialog.show();}@Overrideprotected List<String> doInBackground(String... params){List<String> cities = new ArrayList<String>();String citiesString = HttpUtils.sendPostMessage(params[0], "utf-8");//    解析服务器端的json数据
            cities = JsonUtils.parseCities(citiesString);return cities;}@Overrideprotected void onPostExecute(List<String> result){adapter = new ArrayAdapter<String>(MainActivity.this, android.R.layout.simple_spinner_item, result);adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);spinner.setAdapter(adapter);dialog.dismiss();}}@Overridepublic boolean onCreateOptionsMenu(Menu menu){getMenuInflater().inflate(R.menu.main, menu);return true;}}
复制代码

当然别往了开启我们的网络授权

<uses-permission android:name="android.permission.INTERNET"/>

最后我们来看看效果图:


http://chatgpt.dhexx.cn/article/km85nXQh.shtml

相关文章

Python3 JSON数据解析

JSON是一种比轻量级的数据交换格式。比XML更小、更快、更容易解析。 JSON语法时JavaScript对象表示语法的子集。书写格式为&#xff1a;键:值。用英文逗号为分隔符&#xff0c;{}大括号报错对象&#xff0c;[]中括号报错数组。 python3中使用json模块对JSON进行编码和解码&am…

json数据解析 jsonpath

json是一种文本数据交换格式&#xff0c;不是一种语言 jsonpath是一种语法&#xff0c;用于json数据&#xff0c;类似xpath用于html 1.json.dumps json.loads 需要import json json.dumps——将python数据转化为json数据 实际上就是将python里面的字典转化成json格式的数…

Android开发--Json数据的解析

在执行解析数据之前&#xff0c;需要将一个类库应用到你的程序中&#xff0c;下载的地址是&#xff1a; http://code.google.com/p/google-gson/ 下载解压之后你需要将蓝色标记的文件放入到你的程序之中应用 首先&#xff0c;我们需要知道什么是Json数据: JSON的定义&…

Python3 JSON 数据解析

Python3 中可以使用 json 模块来对 JSON 数据进行编解码&#xff0c;它包含了两个函数&#xff1a; json.dumps(): 对数据进行编码。json.loads(): 对数据进行解码。 示例&#xff1a; # -*- coding:utf-8 -*-import json # 加载json模块data { # 定义一个字典类型a: 1,b:…

json数据解析(json数据解析 前端)

JAVA为什么要返回JSON数据&#xff1f;JAVA为什么要返回JSON数? print( String()); 这样在前台页面就可以通过eval(data。List)获取到。 输出 String()就可以看到讲一个java对象转换成json对象的结果。其他java对象也可以这么来处理。 另外还有就是 List list new ArrayL…

JSON 数据解析的方法

JSON 数据解析 JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。它基于ECMAScript的一个子集。 JSON采用完全独立于语言的文本格式&#xff0c;但是也使用了类似于C语言家族的习惯&#xff08;包括C、C、C#、Java、JavaScript、Perl、Python等&#xff09;。这…

手动JSON数据解析

1.将json格式的字符串{}转化为JAVA对象 //第一步&#xff1a;获取或创建Json数据String json "{\n" " \"id\":2,\"name\":\"小龙虾\",\n" " \"price\":12.3,\n" " …

【Python爬虫与数据分析】爬虫Json数据解析

目录 一、Json文件数据解析 二、Json数据包解析获取图片资源 三、Json数据包解析获取视频资源 一、Json文件数据解析 json字符串&#xff1a;通常类似python数据类型中的列表和字典的结合&#xff0c;也可能是单独的列表或者字典格式&#xff0c;通常可以通过json模块的函数…

Json格式数据解析

一、简介 XML这种数据格式。XML的特点是功能全面&#xff0c;但标签繁琐&#xff0c;格式复杂。在Web上使用XML现在越来越少&#xff0c;取而代之的是JSON这种数据结构。 JSON是JavaScript Object Notation的缩写&#xff0c;它去除了所有JavaScript执行代码&#xff0c;只保…

JSON解析

#粤嵌星计划&#xff0c;粤嵌我来了# #粤嵌星计划&#xff0c;粤嵌我来了# 1、什么是JSON &#xff08;1&#xff09;JSON&#xff08;Java Script Object Notation&#xff09;是一种轻量级的数据交换语言&#xff0c;以文本字符串为基础&#xff0c;且易于让人阅读。&#x…

内网穿透原理解析

在互联网信息时代的今天&#xff0c;经常会听到外网连接。而与外网所相对应的&#xff0c;是一种内部网络&#xff0c;很多的家庭或者公司利用内部网络来进行多台电脑之间的资源共享&#xff0c;其中所用到的技术就是内网穿透技术&#xff0c;但却有很多的人对这种技术并不了解…

内网穿透原理概要

详细原理的解析 https://blog.csdn.net/xinpz/article/details/82732217 运行原理流程图 什么是内网穿透? 内网穿透是我们在进行网络连接时的一种术语&#xff0c;也叫做NAT穿透&#xff0c;即在计算机是局域网内的时候&#xff0c;外网与内网的计算机的节点进行连接时所需…

内网穿透内容讲解

内网穿透又叫端口映射&#xff0c;用一句最简单的话来讲就是&#xff1a;将你的计算机所连接的私有网络映射到公网上&#xff0c;别人通过你给的域名或ip即可访问你本地的服务。具体的原理可参照百度百科 这么做可以实现各大厂商的云服务器&#xff08;阿里云&#xff0c;腾讯云…

内网穿透你真的了解吗?

前言 内网穿透作为程序员常用的调试手段之一&#xff0c;我们可以通过在个人电脑上运行花生壳或者 frp 等方式&#xff0c;让他人访问我们本地启动的服务&#xff0c;而且这种访问可以不受局域网的限制&#xff0c;当我们使用ngrok,frp等开源框架时&#xff0c;你是否有好奇过…

Ngrok内网穿透

Ngrok一款内网穿透工具&#xff0c;它可以将本地部署的Web应用能够让公网环境直接访问到。ngrok是一个反向代理&#xff0c;通过在公共端点和本地运行的Web服务器之间建立一个安全的通道&#xff0c;实现内网主机的服务可以暴露给外网。所以它提供了一个能够在公网安全访问内网…

大白话告诉你内网穿透原理和验证

内网穿透到底干啥的这里不做详述&#xff0c;这篇文章主要是讲这玩意怎么做的 分析 网上有很多原理图&#xff0c;但是说实话鄙人天资愚钝没咋看懂&#xff0c;在网上疯狂百度和个人的验证之后&#xff0c;得出如下简图 其实很简单 想让我们内网的服务能被外网访问到&#x…

frp内网穿透原理及配置应用

1 Frp介绍 frp 是一个专注于内网穿透的高性能的反向代理应用&#xff0c;支持 TCP、UDP、HTTP、HTTPS 等多种协议。可以将内网服务以安全、便捷的方式通过具有公网 IP 节点的中转暴露到公网。 frp 项目官网 https://github.com/fatedier/frp 中文文档 https://github.com/fat…

内网穿透原理,以及用花生壳实现内网穿透

在做自学项目部署nginx的时候&#xff0c;nginx部署在阿里云服务器上&#xff0c;项目在本地&#xff0c;阿里云的nginx无法访问到本地的ip&#xff0c;所以需要做一下内网穿透。记录一下 什么是内网穿透&#xff1f; 内网和外网的概念&#xff1a; 内网&#xff1a;即所说的局…

内网穿透原理和实现

什么是内网穿透 作者&#xff1a;匿名用户 链接&#xff1a;https://www.zhihu.com/question/63098230/answer/1929852198 希望对你们更易懂要知道这个的意思&#xff0c;需要先来点前菜 1、地球上的电脑设备等要实现通信&#xff0c;都需要有个IP地址才可以实现。 2、IP地址…

内网穿透原理和实现思路介绍

内网穿透技术&#xff0c;简单理解就是将内网的服务映射到公网中&#xff0c;这样可以随时随地访问。 那什么是内网&#xff1f;什么是公网&#xff1f;先从这个基本概念来简单介绍吧 1. 公网、内网和外网 首先声明&#xff0c;公网、内网和外网这几个概念&#xff0c;不是专…