質問:JSONデータはどのように解析しますか?


この問題は、プログラマーとしてほぼ毎日行われる操作ですが、どのような方法があるのでしょうか.ここでは、この点について説明します.

解析の4つの方法

  • 公式解析
  • Google Gson解析
  • アリババFastJson解析
  • Jackson解析
  • 実例実操


    ここでは,オブジェクトとjsonがどのように互いに変換するかだけを議論する.
    ここではまずMavenプロジェクトを作成し、依存を導入しやすくし、ユニットテストを通じて私たちの異なる解析方法を実際に検証します.
    次に、Userオブジェクトを使用して、必要なクラスを作成します.
    User.java
    package org.example;
    
    public class User {
    
        private String name;
        private String sex;
        private Integer age;
    
        public User() {
        }
    
        public User(String name, String sex, Integer age) {
            this.name = name;
            this.sex = sex;
            this.age = age;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public String getSex() {
            return sex;
        }
    
        public void setSex(String sex) {
            this.sex = sex;
        }
    
        public Integer getAge() {
            return age;
        }
    
        public void setAge(Integer age) {
            this.age = age;
        }
    
        @Override
        public String toString() {
            return "User{" +
                    "name='" + name + '\'' +
                    ", sex='" + sex + '\'' +
                    "
    
    ###     
    
          json     ,    ,        。
    
       ,    :
    
    org.json
    json
    20160810
    
       ,      :
    

    package org.example;
    import org.json.JSONObject;import org.springframework.stereotype.Component;
    /**
  • 公式解析
  • */@Componentpublic class JsonTest1 {
    /**
     *    json
     * @param user
     * @return
     */
    public String userToJson(User user){
        JSONObject jsonObject = new JSONObject(user);
        String jsonStr = jsonObject.toString();
        return jsonStr;
    }
    
    /**
     * json   
     * @param json
     * @return
     */
    public User userFromJson(String json){
        JSONObject jsonObject = new JSONObject(json);
        String name = jsonObject.getString("name");
        String sex = jsonObject.getString("sex");
        int age = jsonObject.getInt("age");
        User user = new User(name,sex,age);
        return user
    

    ステップ3、ユニットテスト:
    package org.example;
    
    import org.junit.Test;
    import org.junit.runner.RunWith;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.test.context.ContextConfiguration;
    import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
    
    @RunWith(SpringJUnit4ClassRunner.class)
    @ContextConfiguration(locations = "classpath:spring.xml")
    public class JsonTest1Test {
    
        @Autowired
        private JsonTest1 jsonTest1;
    
        @Test
        public void userToJson() {
            User user = new User("  ", "man", 18);
            String json = jsonTest1.userToJson(user);
            System.out.println(json);
        }
    
        @Test
        public void userFromJson() {
            String json = "{\"sex\":\"man\",\"name\":\"  \",\"age\":18}";
            User user = jsonTest1.userFromJson(json);
            System.out.println(user);
        }
    }

    ステップ4で、結果を表示します.

    Google Gson解析


    最初のステップでは、依存を導入します.
    
    
        com.google.code.gson
        gson
        2.8.5
    

    ステップ2では、テストコードを作成します.
    package org.example;
    
    import com.google.gson.Gson;
    import org.springframework.stereotype.Component;
    
    /**
     * gson  
     */
    @Component
    public class JsonTest2 {
    
        /**
         *    json
         * @param user
         * @return
         */
        public String userToJson(User user){
            Gson gson = new Gson();
            String json = gson.toJson(user);
            return json;
        }
    
        /**
         * json   
         * @param json
         * @return
         */
        public User userFromJson(String json){
            Gson gson = new Gson();
            User user = gson.fromJson(json, User.class);
            return user;
        }
    
    }

    ステップ3、ユニットテスト:上(以下ステップ3、ステップ4と上は同じなので省略)
    ステップ4で、結果を表示します.

    アリババFastJson解析


    この解析方式はアリババが開発したもので、効率が最も高く、みんなに愛され、機能が強く、もっと深く勉強したいならFastJson官网APIを見ることができます.
    最初のステップでは、依存を導入します.
    
    
        com.alibaba
        fastjson
        1.2.47
    

    ステップ2では、テストコードを作成します.
    package org.example;
    
    import com.alibaba.fastjson.JSONObject;
    import org.springframework.stereotype.Component;
    
    /**
     * fastjson  
     */
    @Component
    public class JsonTest3 {
    
        /**
         *    json
         * @param user
         * @return
         */
        public String userToJson(User user){
            String json = JSONObject.toJSONString(user);
            return json;
        }
    
        /**
         * json   
         * @param json
         * @return
         */
        public User userFromJson(String json){
            User user = JSONObject.parseObject(json,User.class);
            return user;
        }
    
    }

    Jackson解析


    この解析方式は現在最も流行しているSSM、SpringBootなどのフレームワークを使用しており、その内部のjson解析ではJacksonが使用されているが、速度が速いため、FastJsonを別途導入して使用することが多い.
    最初のステップでは、依存を導入します.
    
    
        com.fasterxml.jackson.core
        jackson-databind
        2.9.8
    

    ステップ2では、テストコードを作成します.
    package org.example;
    
    import com.fasterxml.jackson.core.JsonProcessingException;
    import com.fasterxml.jackson.databind.ObjectMapper;
    import org.springframework.stereotype.Component;
    
    import java.io.IOException;
    
    /**
     * jackson  
     */
    @Component
    public class JsonTest4 {
    
        /**
         *    json
         * @param user
         * @return
         */
        public String userToJson(User user) throws JsonProcessingException {
            ObjectMapper objectMapper = new ObjectMapper();
            String json = objectMapper.writeValueAsString(user);
            return json;
        }
    
        /**
         * json   
         * @param json
         * @return
         */
        public User userFromJson(String json) throws IOException {
            ObjectMapper objectMapper = new ObjectMapper();
            User user = objectMapper.readValue(json, User.class);
            return user;
        }
    
    }

    拡張~JSONの誕生


    JSONの誕生はXMLがHTMLに統合されているため各ブラウザで実現される細部が異なるため、ダグラス・クロークフォード(Douglas Crockford)とチップ・モニンスダ(Chip Morningstar)が共にJSのデータ型からサブセットを抽出し、新しいデータ交換フォーマットとして、主流のブラウザが汎用的なJavaScriptエンジンコンポーネントを使用しているため、そのため、この新しいデータフォーマットを解析する際に互換性の問題は存在しないため、彼らはこのデータフォーマットを「JavaScript Object Notation」と命名し、JSONと略称し、JSONが誕生した。質問:JSONデータはどのように解析しますか?


    この問題は、プログラマーとしてほぼ毎日行われる操作ですが、どのような方法があるのでしょうか.ここでは、この点について説明します.

    解析の4つの方法

  • 公式解析
  • Google Gson解析
  • アリババFastJson解析
  • Jackson解析
  • 実例実操


    ここでは,オブジェクトとjsonがどのように互いに変換するかだけを議論する.
    ここではまずMavenプロジェクトを作成し、依存を導入しやすくし、ユニットテストを通じて私たちの異なる解析方法を実際に検証します.
    次に、Userオブジェクトを使用して、必要なクラスを作成します.
    User.java
    package org.example;​public class User {​ private String name; private String sex; private Integer age;​ public User() { }​ public User(String name, String sex, Integer age) { this.name = name; this.sex = sex; this.age = age; }​ public String getName() { return name; }​ public void setName(String name) { this.name = name; }​ public String getSex() { return sex; }​ public void setSex(String sex) { this.sex = sex; }​ public Integer getAge() { return age; }​ public void setAge(Integer age) { this.age = age; }​ @Override public String toString() { return "User{"+ "name='"+ name + ''' + ", sex='"+ sex + ''' + ", age="+ age + '}'; }
    }​

    公式解析


    公式提供のjson解析方式は、煩雑なので、使う人は少ない.
    最初のステップでは、依存を導入します.
    org.json json 20160810
    ステップ2では、テストコードを作成します.
    package org.example;​import org.json.JSONObject;import org.springframework.stereotype.Component;​/**
  • 公式解析
  • */@Componentpublic class JsonTest1 {​/**
  • オブジェクト回転json
  • @param user
  • @return

  • */public String userToJson(User user){ JSONObject jsonObject = new JSONObject(user); String jsonStr = jsonObject.toString(); return jsonStr; }​/**
  • json回転オブジェクト
  • @param json
  • @return

  • */public User userFromJson(String json){ JSONObject jsonObject = new JSONObject(json); String name = jsonObject.getString("name"); String sex = jsonObject.getString("sex"); int age = jsonObject.getInt("age"); User user = new User(name,sex,age); return user; }​}
    ステップ3、ユニットテスト:
    package org.example;​import org.junit.Test;import org.junit.runner.RunWith;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.test.context.ContextConfiguration;import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;@RunWith(SpringJUnit 4 ClassRunner.class)@ContextConfiguration(locations="classpath:spring.xml")public class JsonTest 1 Test{@Autowired private JsonTest 1 jsonTest 1;@Test public void userToJson(){User user=new User("秦明","man", 18);String json=jsonTest 1.userToJson(user);System.out.pri. pri. prim.prim.prin(user);System.out.pristem.out.prim.prim.prim.prinit.ntln(json);}@Test public void userFromJson(){String json="{"sex":"man","name":"秦明","age":18};User user = jsonTest1.userFromJson(json); System.out.println(user); }}
    ステップ4で、結果を表示します.

    Google Gson解析


    最初のステップでは、依存を導入します.
    com.google.code.gson gson 2.8.5
    ステップ2では、テストコードを作成します.
    package org.example;​import com.google.gson.Gson;import org.springframework.stereotype.Component;​/**
  • gson解析
  • */@Componentpublic class JsonTest2 {​/**
  • オブジェクト回転json
  • @param user
  • @return

  • */public String userToJson(User user){ Gson gson = new Gson(); String json = gson.toJson(user); return json; }​/**
  • json回転オブジェクト
  • @param json
  • @return

  • */public User userFromJson(String json){ Gson gson = new Gson(); User user = gson.fromJson(json, User.class); return user; }​}
    ステップ3、ユニットテスト:上(以下ステップ3、ステップ4と上は同じなので省略)
    ステップ4で、結果を表示します.

    アリババFastJson解析


    この解析方式はアリババが開発したもので、効率が最も高く、みんなに愛され、機能が強く、もっと深く勉強したいならFastJson官网APIを見ることができます.
    最初のステップでは、依存を導入します.
    com.alibaba fastjson 1.2.47
    ステップ2では、テストコードを作成します.
    package org.example;​import com.alibaba.fastjson.JSONObject;import org.springframework.stereotype.Component;​/**
  • fastjson解析
  • */@Componentpublic class JsonTest3 {​/**
  • オブジェクト回転json
  • @param user
  • @return

  • */public String userToJson(User user){ String json = JSONObject.toJSONString(user); return json; }​/**
  • json回転オブジェクト
  • @param json
  • @return

  • */public User userFromJson(String json){ User user = JSONObject.parseObject(json,User.class); return user; }​}

    Jackson解析


    この解析方式は現在最も流行しているSSM、SpringBootなどのフレームワークを使用しており、その内部のjson解析ではJacksonが使用されているが、速度が速いため、FastJsonを別途導入して使用することが多い.
    最初のステップでは、依存を導入します.
    com.fasterxml.jackson.core jackson-databind 2.9.8
    ステップ2では、テストコードを作成します.
    package org.example;​import com.fasterxml.jackson.core.JsonProcessingException;import com.fasterxml.jackson.databind.ObjectMapper;import org.springframework.stereotype.Component;​import java.io.IOException;​/**
  • jackson解析
  • */@Componentpublic class JsonTest4 {​/**
  • オブジェクト回転json
  • @param user
  • @return

  • */public String userToJson(User user) throws JsonProcessingException { ObjectMapper objectMapper = new ObjectMapper(); String json = objectMapper.writeValueAsString(user); return json; }​/**
  • json回転オブジェクト
  • @param json
  • @return

  • */public User userFromJson(String json) throws IOException { ObjectMapper objectMapper = new ObjectMapper(); User user = objectMapper.readValue(json, User.class); return user; }​}

    拡張~JSONの誕生


    JSONの誕生はXMLがHTMLに統合されているため各ブラウザで実現される細部が異なるため、ダグラス・クロークフォード(Douglas Crockford)とチップ・モニンスダ(Chip Morningstar)が共にJSのデータ型からサブセットを抽出し、新しいデータ交換フォーマットとして、主流のブラウザが汎用的なJavaScriptエンジンコンポーネントを使用しているため、そのため、この新しいデータフォーマットを解析する際に互換性の問題は存在しないため、彼らはこのデータフォーマットを「JavaScript Object Notation」と命名し、JSONと略称し、JSONが誕生した.