Json(java版)梳理、Idea中打jar包、Android中解析Json

本文围绕Java版JSON展开,涵盖三部分内容。一是介绍在IDEA中生成Jar包的方法,包括基础打包和引入Jar Lib库;二是阐述Json与文件、String等的8种转换方式;三是讲解在Android中使用JSONObject、GSON等解析JSON数据,文末还分享了相关jar包链接。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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包:

  1. 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包了:
    在这里插入图片描述
  1. Jar Lib库:(功能更加强大!!!)
    还是去JSON网站上,在这里插入图片描述
    注意,这里必须要添加圈出的jar包,有点多。文末提供百度云盘分享链接
    在这里插入图片描述
  2. 关键的步骤:在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内容就开始进行解析它们吧~

  1. 使用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()方法将这些数据取出,并打印出来即可。
但是不得不说,有点麻烦~~~

  1. 使用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包的百度云盘分享链接:

  1. 基础jar包:
    https://pan.baidu.com/s/1rHNPgd2kD0ZwjBNiy10YXw
    提取码:eesz

  2. 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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

醒不了的星期八

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值