前言

有段时间没接触JSON了,在实际工作中,大部分项目都有了现成的JSON使用规范,但是最近自己独立开发项目的时候,发现配置一个JSON居然显得那么的不熟悉,各种百度,各种凌乱的问题,这里还是老实点,做个总结吧。

JSONObject

一般生成json字符串有三种方式,1、直接利用JSONObject进行put操作,2、利用Map构建json对象,3、利用Java对象构建json字符串

下面统一构建一个json对象,具体格式如下:

{
	"name":"王小二",
	"age":"25",
	"birthday":"1992-01-01",
	"school":"蓝翔",
	"major":["理发","挖掘机"],
	"has_girlFriend":true,
	"car":true,
	"house":true,
	"comment":"这是一个注释"
}

直接手动构建JSONObject

直接手动构建JSONObject就是将一个个元素手动放到JSONObject中,这种无异于原始社会的操作,技术含量偏低,这里只给出实例吧

/**
     * 直接手动构建JSONObject
     */
    private static void JSONObjectDemo(){
        Object nullObj = null;
        JSONObject person = new JSONObject();
        person.put("name","王小二");
        person.put("age",25);
        person.put("birthday","1990-01-01");
        person.put("school","蓝翔");
        person.put("major",new String[]{"理发","挖掘机"});
        person.put("has_girlFirend",true);
        person.put("car",nullObj);
        person.put("house",true);
        person.put("comment","这是一个注释");

        System.out.println(person.toString());
    }

 利用map构建JSONObject

在构建JSONObject对象的时候可以指定map类型的对象

/**
     * 利用map构建json对象
     */
    private static void createJsonObjectByMap(){
        Map<String,Object> person = new HashMap<String,Object>();
        Object nullObj = null;
        person.put("name","王小二");
        person.put("age",25);
        person.put("birthday","1990-01-01");
        person.put("school","蓝翔");
        person.put("major",new String[]{"理发","挖掘机"});
        person.put("has_girlFirend",true);
        person.put("car",nullObj);
        person.put("house",true);
        person.put("comment","这是一个注释");

        JSONObject personJson = new JSONObject(person);
        System.out.println(personJson.toString());

    }

 利用JavaBean对象构建JSONObject

JSONObject的构造函数,同样也能传递一个JavaBean对象,其实JSONObject的构造函数接受参数是一个Object,因此大部分的java对象都能构造成json,这里只是总结了常用的三种构建JSONObject的方式

/**
     * 利用javaBean构建json对象
     */
    private static void createJsonObjectFromBean(){
        Person person = new Person();
        person.setName("王小二");
        person.setAge(25.2);
        person.setBirthday("1990-01-01");
        person.setSchool("蓝翔");
        person.setMajor(new String[]{"理发","挖掘机"});
        person.setHasGirlFriend(true);
        person.setHouse(true);
        person.setCar(null);
        person.setComment("这是一个注释");

        JSONObject jsonObjectPerson = new JSONObject(person);
        System.out.println(jsonObjectPerson.toString());
    }

测试结果:

java中创建json格式数据 jsonobject创建_System

 

JSONObject的解析

其实JSONObject的解析也异常简单,只是需要注意JSONArray的解析,其余的都大同小异,哎,还是直接上实例吧

package com.learn.json.JSONDemo.readJson;

import org.apache.commons.io.FileUtils;
import org.json.JSONArray;
import org.json.JSONObject;

import java.io.File;
import java.io.IOException;

/**
 * autor:liman
 * comment:
 * 获取json数据,并解析json数据
 */
public class ReadJsonDemo {

    public static void main(String[] args) throws IOException {
        //读取文件
        File file = new File(ReadJsonDemo.class.getResource("/person.json").getFile());
        String content = FileUtils.readFileToString(file);

        //根据字符串转换成JSONObject
        JSONObject jsonObject = new JSONObject(content);

        //JSON数据的判空操作
        if(!jsonObject.isNull("nickName")){
            System.out.println("昵称是:"+jsonObject.get("nickName"));
        }
        System.out.println("姓名是:"+jsonObject.getString("name"));
        System.out.println("年龄是:"+jsonObject.getDouble("age"));
        System.out.println("是否有媳妇:"+jsonObject.getBoolean("has_girlFriend"));

        //jsonArray的转换需要注意
        JSONArray majorArray = jsonObject.getJSONArray("major");
        for(int i =0;i<majorArray.length();i++){
            System.out.println(majorArray.get(i));
        }
    }
}

实例异常简单

GSON

在实际开发中用的较多的json转换工具就是GSON了,能较方便的将json与java对象进行相互转换,这个不是JSONObject能做到的,同时GSON还支持转换的定制化操作。

先给出对应的bean实例

package com.learn.json.JSONDemo.bean;

import com.google.gson.annotations.SerializedName;

import java.util.Arrays;

/**
 * autor:liman
 * comment:
 */
public class Person {

//    @SerializedName("NAME") //这个注解来自于GSON,可以允许名称自定义
    private String name;
    private String school;
    private boolean hasGirlFriend;
    private double age;
    private Object car;
    private Object house;
    private String[] major;
    private String comment;
    private String birthday;

    private transient String ignore;

    /**
        省略getter和setter操作
    **/
}

1、JSON与对象的相互转换

将对象转换成json字符串

package com.learn.json.JSONDemo.GSON;

import com.google.gson.FieldNamingStrategy;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.learn.json.JSONDemo.bean.Person;

import java.lang.reflect.Field;

/**
 * autor:liman
 * comment:
 * GSON的使用方式
 */
public class GSONDemo {

    public static void main(String[] args) {
        Person person = new Person();
        person.setName("王小二");
        person.setAge(25.2);
        person.setBirthday("1990-01-01");
        person.setSchool("蓝翔");
        person.setMajor(new String[]{"理发","挖掘机"});
        person.setHasGirlFriend(true);
        person.setHouse(true);
        person.setCar(null);
        person.setComment("这是一个注释");
        person.setIgnore("不要看见我");

        //生成json字符串,这种方式和JSONObject原生差不多
        Gson gson = new Gson();
        System.out.println(gson.toJson(person));

        //在生成json字符串之前,利用builder进行相关操作
        GsonBuilder gsonBuilder = new GsonBuilder();
        gsonBuilder.setPrettyPrinting();

        //构建json数据的时候,可以修改名字
        gsonBuilder.setFieldNamingStrategy(new FieldNamingStrategy() {
            @Override
            public String translateName(Field field) {
                if("name".equals(field.getName()))
                {return "NAME";}
                return field.getName();
            }
        });
        Gson gsonbyBuilder = gsonBuilder.create();
        System.out.println(gsonbyBuilder.toJson(person));
    }

}

 在构建json转换的时候,主要是toJson这个方法,在正式转换成json字符串的时候,还可以手动构建相关属性,利用GsonBuilder去设置相关策略。如上述代码所示。其中就针对name属性的名称做了修改。同时也做了格式化输出,最终结果如下:

java中创建json格式数据 jsonobject创建_JSON_02

 将JSON字符串解析成指定对象

GSON比JSONObject优秀的地方就在于,能完成JSON字符串到java对象的映射。当然现在很多json解析包都能完成这个功能。这里只总结了GSON,但在使用方面都大同小异。

package com.learn.json.JSONDemo.GSON;

import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.learn.json.JSONDemo.bean.Person;
import com.learn.json.JSONDemo.bean.PersonWithDate;
import com.learn.json.JSONDemo.bean.PersonWithList;
import com.learn.json.JSONDemo.readJson.ReadJsonDemo;
import org.apache.commons.io.FileUtils;

import java.io.File;
import java.io.IOException;

/**
 * autor:liman
 * comment:
 * 使用GSON对json字符串进行解析
 */
public class GSONDeserializeDemo {
    public static void main(String[] args) throws IOException {
        //读取文件
        File file = new File(ReadJsonDemo.class.getResource("/person.json").getFile());
        String content = FileUtils.readFileToString(file);

        //相比JSONObject来说,这个可以解析成指定的对象,而JSONObject不行
        Gson gson = new Gson();
        Person person = gson.fromJson(content, Person.class);
        System.out.println(person.toString());

        //日期格式的转换
        GsonBuilder gsonBuilder = new GsonBuilder();
        Gson gsonDate = gsonBuilder.setDateFormat("yyyy-MM-dd").create();
        PersonWithDate personWithDate = gsonDate.fromJson(content, PersonWithDate.class);
        System.out.println(personWithDate.getBirthday().toLocaleString());

        //GSON可以将json中的数组和Java集合进行无缝对接
        Gson gsonCollection = gsonBuilder.create();
        PersonWithList personWithList = gsonCollection.fromJson(content, PersonWithList.class);
        System.out.println(personWithList.getMajor());
        System.out.println(personWithList.getMajor().getClass().getSimpleName());
    }
}

 重点是gson.fromJson(content,Person.class)这个方法,这个方法将json字符串解析成指定的对象。

2、JSON日期格式的转换

依旧是上述的实例,重点是以下几行代码

//日期格式的转换
        GsonBuilder gsonBuilder = new GsonBuilder();
        Gson gsonDate = gsonBuilder.setDateFormat("yyyy-MM-dd").create();
        PersonWithDate personWithDate = gsonDate.fromJson(content, PersonWithDate.class);
        System.out.println(personWithDate.getBirthday().toLocaleString());

 通过GsonBuilder设置日期格式的转换,PersonWithDate对象只是将Person对象中的birthDay属性修改成了Date属性

3、JSON的集合对象的转换

//GSON可以将json中的数组和Java集合进行无缝对接
        Gson gsonCollection = gsonBuilder.create();
        PersonWithList personWithList = gsonCollection.fromJson(content, PersonWithList.class);
        System.out.println(personWithList.getMajor());
        System.out.println(personWithList.getMajor().getClass().getSimpleName());

PersonWithList对象中,已经将Major属性修改成了List属性,这里也没有做什么操作,直接进行转换。GSON可以将JSONArray与java对象的集合进行无缝对接。

总结

easy,非常之easy,针对多对象的依赖转换成json没有提及,尤其是循环依赖问题,后续会补上。