Json(java版)梳理、Idea中打jar包、Android中解析Json
本文分为3个板块,进行梳理:
文末提供了相关jar包的百度云盘分享链接。
1.jar包的准备、IDEA中怎么打包
2.Json的String、Map、JSONObject、JSONArray、File等与json的8种转换
3.Android中怎么解析Json
注意: 本文将jar包分为2种。1种是IDEA基础打包,1种是Jar Lib库。
一. Jar包的准备、IDEA中生成Jar包:
- IDEA进行jar(java)基础功能库打包:
- 进官网,下载zip的源文件:http://json.org/ ,打开后找到如下图所示:
进去之后是进到了github,然后download zip即可。
- 接下来,就是对这些源文件通过idea打包(eclipse也ok)
首先我们随便打开一个源代码,确定它的包名:package org.json
然后打开idea,随便建立一个项目,在src包下新建一个org.json的包,然后把源代码的.java文件都拷贝到该包下,然后打开右上角的图标(project structure):
上述就是idea的打包操作,等一会儿后,就可以在输出目录下看见打包好的jar包了:
- Jar Lib库:(功能更加强大!!!) :
还是去JSON网站上,
注意,这里必须要添加圈出的jar包,有点多。文末提供百度云盘分享链接
- 关键的步骤:在idea中引入jar包
还是project structure(idea右上角的图标)->Modules->Dependencies->+加号->JARS OR…,选择相应的jar包就可以了,我这里一次性将2种jar包都导进来了。
好啦~ 准备工作就完成啦~~
二. Json与文件、String、Map、JSONObject、JSONArray的8种转换方式:
有注释,就不一一分析了~~~略略略
JavaDemo.java:
import net.sf.json.JSON;
import org.apache.commons.io.FileUtils;
import org.json.JSONArray;
import org.json.JSONObject;
import java.io.*;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
public class JavaDemo extends Object {
//Map、javaBean、字符串-》Json对象
/**
* 方式1:Map结合-》Json对象
*/
public static void MapToJson(){
Map<String,String> map =new HashMap<>();
map.put("s01","yinlei");
map.put("s02","yinwei");
map.put("s03","zhangming");
//map->json
JSONObject json=new JSONObject(map);
System.out.println(json);
//json格式:{key:value,key:value,key:value....}
}
/**
*
* 方式2:JavaBean(普通对象Person)-》Map
*/
public static void JavaBeanToJson(){
Person person=new Person();
person.setName("尹磊");
person.setAge(20);
Address address=new Address("绵阳","眉山");
person.setAddress(address);
//JavaBean->json
JSONObject jsonObject=new JSONObject(person);
System.out.println(jsonObject);
/** 对象->json:{对象的属性名1:属性值1,对象的属性名2:属性值2}
* 结果:{"address":{"schoolAddress":"眉山","homeAddress":"绵阳"},"name":"尹磊","age":20}
* {
* "address": {
* "schoolAddress": "眉山",
* "homeAddress": "绵阳"
* },
* "name": "尹磊",
* "age": 20
* }
*/
}
/**
* 字符串-》json
* 前提:String得必须像json,或者说就是Json(形式)
*/
public static void StringToJson(){
//{"name":"尹磊","age":20}(比如这个json,直接粘贴自动转义)
String str="{\"name\":\"尹磊\",\"age\":20}";//符合了json格式
JSONObject json=new JSONObject(str);
}
/**
* 文件-》json
* 思路:文件-》String->Json
*/
public void FileToJson() throws IOException {//static只能调static
//文件*》String方式1:
// new File();//绝对路径或者相对路径
// InputStream in=super.getClass().getClassLoader().getResourceAsStream("person.json");//这个可以放相对路径
//
// byte[] bs=new byte[10];
// int len=-1;
// StringBuffer stringBuffer=new StringBuffer();
// while ((len=in.read(bs))!=-1){
// //byte[]->String
// String str=new String(bs,0,len);
// stringBuffer.append(str);
// }
//// System.out.println(stringBuffer);
//StringBuffer->String
// String s=stringBuffer.toString();
//文件*》String方式2:用类库commons-io.jar
//copy path:idea中选中某个文件然后右键即可看见"copy path"
String s=FileUtils.readFileToString(new File("E:\\IdeaProjects\\json java版\\src\\person.json"));//这个参数只能用绝对路径
//String ->Jason
JSONObject json=new JSONObject(s);
System.out.println(json);
}
/**
* 生成json文件
*/
public static void GenJsonFile() throws IOException {
//准备json数据(map->json)
Map<String,Person> map=new HashMap<>();
Person person1=new Person(20,"尹磊",new Address("绵阳","眉山"));
Person person2=new Person(19,"尹伟",new Address("绵阳","江苏"));
Person person3=new Person(20,"张明",new Address("绵阳","温江"));
map.put("yl",person1);
map.put("yw",person2);
map.put("zm",person3);
//map->String
JSONObject json=new JSONObject(map);
//生成Json文件
//idea中查看继承关系的快捷键:ctrl+H
Writer writer=new FileWriter("E:\\person.obj");
json.write(writer);//writer是抽象类,用其子类。参数为生成的文件的输出路径
writer.close();//close或者flush是为了强制把内存到硬盘的流管道推到硬盘中。这样就在硬盘的文件中就不会出现“无反应”
}
/**
* json数组:JSONArray 存放很多个json
* {json,json,json}
*/
/**json数组:(外层是中括号)
* [
* {"name":"尹磊","age":23},{"classname":"软件工程","classno":1},{"school":"眉山","zone":"绵阳"}
* ]
*/
public static void StringTojsonArray(){
//String格式的json数组-》json数组
String jArray="[{\"name\":\"尹磊\",\"age\":23},{\"classname\":\"软件工程\",\"classno\":1},{\"school\":\"眉山\",\"zone\":\"绵阳\"}]";
JSONArray jsonArray=new JSONArray(jArray);
System.out.println(jsonArray);
}
/**
* Map->json数组
* 对于json的类型转换,通常需要引入另一个json库(jsonlib库,更强大)
*/
public static void MapToJssonArray(){
Map<String,String> map=new HashMap<>();
map.put("key1","value1");
map.put("key2","value2");
map.put("key3","value3");
// JSONArray jsonArray=new JSONArray(map);
// System.out.println(jsonArray);
//以上方式报错:JSONArray initial value should be a string or collection or array.
//冲突:JSONArray即存在于json,jar又存在于json-lib库(包名.类名解决冲突)
net.sf.json.JSONArray jsonArray=new net.sf.json.JSONArray();
//map->json
jsonArray=jsonArray.fromObject(map);
System.out.println(jsonArray);
}
/**
* JSONArray->map(使用jsonlib)
*/
public static void JSONArrayToMap(){
//JsonArray->获取每一个json->key:value-》map
//1.获取每一个json
//2.准备jsonArray数据
String jArrayStr="[" +
"{\"name\":\"尹磊\",\"age\":23}," +
"{\"classname\":\"软件工程\",\"classno\":1}," +
"{\"school\":\"眉山\",\"zone\":\"绵阳\"}" +
"]";
//String->jsonarray:
net.sf.json.JSONArray jArray=new net.sf.json.JSONArray();
jArray=jArray.fromObject(jArrayStr);
Map<String,Object> map=new HashMap<>();
//JSONArray->获取每一个json
for (int i=0;i<jArray.size();i++){
Object o=jArray.get(i);//获取每一个json
net.sf.json.JSONObject json= (net.sf.json.JSONObject) o;
//获取每一个json的key/value
Set<String> keys=json.keySet();//每个json的所有key,比如上面的jArrayStr中的每个json有2个key
for (String key:keys) {//遍历每个json的所有key
//根据key拿到value
Object value= json.get(key);//这里注意,json不允许我们强制转换为String
map.put(key,value);
}
}
System.out.println(map);
}
public static void main(String[] args) throws IOException {
MapToJson();
JavaBeanToJson();
StringToJson();
// 总结:JSONObject json=new JSONObject(Map/对象/String);
JavaDemo javaDemo=new JavaDemo();//main是static,而FileToJson要用到相对路径,所以不是staitc,所以调用该方法得通过“对象.方法”的方式
javaDemo.FileToJson();
GenJsonFile();
StringTojsonArray();
//之后全部使用新库json-lib:
MapToJssonArray();
JSONArrayToMap();
}
}
实体类(JavaBean)Person.java:
/**
* JavaBean
*/
public class Person {
private int age;
private String name;
private Address address;
public Person() {
}
public Person(int age, String name, Address address) {
this.age = age;
this.name = name;
this.address = address;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Address getAddress() {
return address;
}
public void setAddress(Address address) {
this.address = address;
}
}
实体类(JavaBean)Address.java:
public class Address {
private String homeAddress;
private String schoolAddress;
public Address() {
}
public Address(String homeAddress, String schoolAddress) {
this.homeAddress = homeAddress;
this.schoolAddress = schoolAddress;
}
public String getHomeAddress() {
return homeAddress;
}
public void setHomeAddress(String homeAddress) {
this.homeAddress = homeAddress;
}
public String getSchoolAddress() {
return schoolAddress;
}
public void setSchoolAddress(String schoolAddress) {
this.schoolAddress = schoolAddress;
}
}
测试person.person:
{
"name" : "尹磊",
"age":"20",
"address":{"homeAdress":"mianyang","school":"meishan"}
}
生成的person.obj文件:
{"yw":{"address":{"schoolAddress":"江苏","homeAddress":"绵阳"},"name":"尹伟","age":19},"yl":{"address":{"schoolAddress":"眉山","homeAddress":"绵阳"},"name":"尹磊","age":20},"zm":{"address":{"schoolAddress":"温江","homeAddress":"绵阳"},"name":"张明","age":20}}
运行结果:
三.Android中解析json:
使用第三方框架,官方提供的JSONObject、谷歌的开源库GSON、和一些优秀的开源库如Jackson、FastJSON等。
这里只对JSONObject、GSON做介绍,其他的可访问Github。
JSON比起XML,它的主要优势在于它的体积更小,在网络传输的时候更加省流量。但缺点是语义性较差,看起来不如XML直观。
JSON数据准备:
在Apache服务器上的htdocs目录中新建一个get_data.json的文件,然后编辑它,加入如下JSON格式的内容:
[{"id":"5","version":"5.5","name":"尹磊"},
{"id":"7","version":"5.7","name":"尹伟"},
{"id":"6","version":"5.6","name":"张明"}]
然后在浏览器中访问http:127.0.0.1/get_data.json文件,如果能看到json内容就开始进行解析它们吧~
- 使用JSONObject:
比如一段常见的网络操作:
private void sendRequestWithOkHttp(){
new Thread(new Runnable(){
@Override
public void run(){
try{
OkHttpClient client=new OkHttpClient();
Request request=new Request.Builder()
//指定访问的服务器是电脑本机
.url("http://10.0.2.2/get_data.json")
.build();
Response response=client.newCall(request).execute();//同步。equenue为异步
String responseData=response.body().string();
parseJSONWithJSONObject(responseData);
}catch(Exception e){
e.printStackTrace();
}
}
}.start();
}
}
........
private void parseJSONWithJSONObject(String jsonData){
try{
JSONArray jsonArray=new JSONArray(jsonData);
for(int i=0;i<jsonArray.length();i++){
JSONObject jsonobject=jsonArray.getJSONObject(i);
String id=jsonobject.getString("id");
String name=jsonobject.getString("name");
String version=jsonobject.getString("version");
Log.d("MainActivity","id is" +id);
Log.d("MainActivity","name is" +name);
Log.d("MainActivity","version is" +version);
}
}catch(Exception e){
e.printStackTrace();
}
}
由于事先在服务器中定义的是一个JSON数据,因此,这里首先是将服务器返回的数据传入到一个JSONArray对象中。然后遍历循环这个JSONArray,从中取出的每一个元素都是一个JSONObject对象,每个JSONObject对象中又会包含id,name和version这些数据,然后调用getString()方法将这些数据取出,并打印出来即可。
但是不得不说,有点麻烦~~~
- 使用GSON:(没有被添加到Android官方的API中。)
- 首先,在app/build.gradle文件的dependencies闭包中,添加依赖(也可以在project structure中在线搜索)
例如使用 compile 'com.google.code.gson:gson:xxx'
- GSON的特别之处:主要是可以i将一段JSON格式的字符串自动映射为一个对象,从而不需要再手动去编写代码进行解析。
比如下面一段json格式的数据:
{"name":"尹磊","age":"20"}
然后定义一个Person类(JavaBean),并加入name和age2个字段,然后简单的调用下面的代码就可将JSON数据自动解析成一个Person对象:
Gson gson=new Gson();
Person person=gson.fromJson(jsonData,Person.class);
- 如果解析的是一段JSONArray会稍微麻烦一点,需要借助TypeToken将期望解析成的数据类型传入到fromJson()方法中:
private void parseJSONWithGSON(String jsonData){
Gson gson=new Gson();
List<Person> personList=gson.fromJson(jsonData,new TypeToken<List<Person>>(){}.getType();
for(Person person:personList){
Log.d("MainActivity","id is" +person.getid());
Log.d("MainActivity","name is" +person.getname());
Log.d("MainActivity","version is" +person.getversion());
}
}
Jar包分享:
2种json jar包的百度云盘分享链接:
-
基础jar包:
https://pan.baidu.com/s/1rHNPgd2kD0ZwjBNiy10YXw
提取码:eesz -
jar lib(推荐这个,功能更强大):
https://pan.baidu.com/s/1M2KX0Ulxp2RVWihHGbm_RA
提取码:6ta4
3.文件转String:commons-io-2.4.jar(这个可以去Maven下载):
https://pan.baidu.com/s/1xv5AWSvIb9ozffO_whednQ
提取码:bv0c
上述Json操作源码及其对应的文件和Jar可访问Github:https://github.com/LeiLeiOfJava/JsonAndJava/tree/master