详解Java解析Json的几种方式

现如今系统开发越来越偏向于前后端分离,和前后端数据传输的方式主要方式是通过Json来传输,在这里我为大家介绍几种Java解析Json的方式。

首先创建Name实体类,并添加set,get,tostring方法。

public class Name {
    private String firstName;
    private String lastName;

    public Name() {
    }

    public Name(String firstName, String lastName) {
        this.firstName = firstName;
        this.lastName = lastName;
    }

    @Override
    public String toString() {
        return "Name{" +
                "firstName='" + firstName + '\'' +
                ", lastName='" + lastName + '\'' +
                '}';
    }

    public String getFirstName() {
        return firstName;
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    public String getLastName() {
        return lastName;
    }

    public void setLastName(String lastName) {
        this.lastName = lastName;
    }
}

并创建两个与之对应的Json(name.json、names.json)
name.json

{ "firstName":"Bill" , "lastName":"Gates" }

names.json

[
    { "firstName":"Bill" , "lastName":"Gates" },
    { "firstName":"George" , "lastName":"Bush" },
    { "firstName":"Thomas" , "lastName":"Carter" }
]

1. 通过JsonReader解析

@Test
    public void parseJSONNames() {
        InputStream is = Thread.currentThread().getContextClassLoader()
                .getResourceAsStream("com/vince/json/names.json");
        InputStreamReader in = new InputStreamReader(is);
        JsonReader reader = new JsonReader(in);
        ArrayList<Name> list = new ArrayList<>();
        try {
            reader.beginArray();
            while (reader.hasNext()) {
                list.add(parseName(reader));
            }
            reader.endArray();
        } catch (IOException e) {
            e.printStackTrace();
        }
        System.out.println(Arrays.toString(list.toArray()));
    }

    private Name parseName(JsonReader jsonReader) {
        Name name=null;
        try {
            jsonReader.beginObject();
            name=new com.vince.json.Name();
            while (jsonReader.hasNext()){
                String attr = jsonReader.nextName();
                if ("firstName".equals(attr)){
                    name.setFirstName(jsonReader.nextString());
                }else if ("lastName".equals(attr)){
                    name.setLastName(jsonReader.nextString());
                }
            }
            jsonReader.endObject();
        } catch (IOException e) {
            e.printStackTrace();
        };
        return name;
    }

解析结果如图:

java 画面解析json数据 java后端解析json_java


2. 通过gson解析

/*
  把一组JSON对象转换成Java集合,或把一个Java集合转换成一组Json对象;
   */
    @Test
    public void gson2(){
        Gson gson = new Gson();
        InputStream is = Thread.currentThread().getContextClassLoader().getResourceAsStream("com/vince/json/names.json");
        InputStreamReader in = new InputStreamReader(is);
        TypeToken<List<Name>> typeToken = new TypeToken<List<Name>>(){};
        List<Name> list = gson.fromJson(in, typeToken.getType());
        String json = gson.toJson(list, typeToken.getType());
        System.out.println(json);
    }
    /*
    把一个JSON对象转换成Java对象,或把一个Java对象转换成Json对象;
     */
    @Test
    public void gson1(){
        Gson gson = new Gson();
        InputStream is = Thread.currentThread().getContextClassLoader().getResourceAsStream("com/vince/json/name.json");
        InputStreamReader in = new InputStreamReader(is);
        Name name = gson.fromJson(in, Name.class);

        String j = gson.toJson(name);
        System.out.println(j);
    }

解析结果如图:

java 画面解析json数据 java后端解析json_java_02


java 画面解析json数据 java后端解析json_Java_03

代码是很早写的,有很多命名不规范的地方,还请谅解。