Java jsonシーケンス化フレームワークをゼロから手動で実現

5103 ワード

json
jsonはjava実装のシーケンス化jsonフレームワークである.
とくせい
  • 8大基本タイプサポート
  • 基本タイプ/オブジェクト配列/集合/列挙/オブジェクトサポート
  • 極めて簡単なAPI
  • 後続のプロパティ
  • @Field注記のサポート
  • アンチシーケンス化オブジェクトの整合性サポートは、現在はベースのアンチシーケンス化のみがサポートされています.

  • なぜ創作するのか
  • fastJsonの不足を解決
  • FastJSONはシーケンス化自体に一定の制限がある.オブジェクトに集合があり,集合中にオブジェクトがある場合,結果は望ましくない.
  • 軽量かつ高効率
  • FastJsonなどのjsonツールは特性が豊富ですが、考えすぎて互換性がありすぎます.
    シーケンス化と逆シーケンスを厳格に制御することで、コードを効率的に軽量化し、自分の使用シーンにより適したものにしたい.
  • 後続開拓
  • 後続のシーケンス化に関連して、このツールを使用して実現し、自分で勉強を広げるのに便利になります.
    変更ログ
    変更ログ
    クイックスタート
    環境依存
    JDK 1.7+
    Maven 3.X
    maven依存
    
        com.github.houbb
        json
            
    

    基本例
    import JsonBs;
    import org.junit.Assert;
    import org.junit.Test;
    
    /**
     * null   
     * @author binbin.hou
     * @since 0.0.1
     */
    public class NullTest {
    
        @Test
        public void nullTest() {
            final String string = null;
            Assert.assertEquals("null", JsonBs.serialize(string));
    
            final String result = JsonBs.deserialize("null", String.class);
            Assert.assertNull(result);
        }
    
    }

    テストケース
    次の説明は、すべてのテストコードを参照してください.
    testモジュール
    文字列とcharテストケース
    文字列
     @Test
    public void commonTest() {
        final String string = "123";
        Assert.assertEquals("\"123\"", JsonBs.serialize(string));
    
        final String json = "\"123\"";
        Assert.assertEquals(string, JsonBs.deserialize(json, String.class));
    }
    
    @Test
    public void escapeTest() {
        final String string = "\"123";
        Assert.assertEquals("\"\"123\"", JsonBs.serialize(string));
    
        final String json = "\"123\"";
        Assert.assertEquals("123", JsonBs.deserialize(json, String.class));
    }

    charタイプ
    @Test
    public void escapeTest() {
        char c = '\'';
        final String json = "\"'\"";
    
        Assert.assertEquals(json, JsonBs.serialize(c));
        assert c == JsonBs.deserialize(json, char.class);
    }

    配列のサポート
    文字列
    @Test
    public void stringEmptyTest() {
        String[] strings = new String[]{};
        String json = "[]";
    
        Assert.assertEquals(json, JsonBs.serialize(strings));
        Assert.assertEquals(strings, JsonBs.deserialize(json, String[].class));
    }
    
    @Test
    public void stringTest() {
        String[] strings = new String[]{"a", "b", "c"};
        final String json = "[\"a\",\"b\",\"c\"]";
        Assert.assertEquals(json, JsonBs.serialize(strings));
        Assert.assertEquals(strings, JsonBs.deserialize(json, String[].class));
    }

    基本タイプテスト
    public void intTest() {
        int[] ints = new int[]{1,2,3};
        final String intJson = "[1,2,3]";
        Assert.assertEquals(intJson, JsonBs.serialize(ints));
    
        //[1, 2, 3]
        System.out.println(Arrays.toString(JsonBs.deserialize(intJson, int[].class)));
    }

    基本オブジェクトタイプテスト
    public void integerTest() {
        Integer[] ints = new Integer[]{1,2,3};
        final String json = "[1,2,3]";
        Assert.assertEquals(json, JsonBs.serialize(ints));
    
        //[1, 2, 3]
        System.out.println(Arrays.toString(JsonBs.deserialize(json, Integer[].class)));
    }

    しゅうごう
    文字列リストのテスト
    public void stringTest() {
        List strings = new ArrayList<>();
        strings.add("10");
        strings.add("20");
        strings.add("30");
    
        Class clazz = strings.getClass();
    
        final String json = "[\"10\",\"20\",\"30\"]";
        Assert.assertEquals(json, JsonBs.serialize(strings));
        Assert.assertEquals(strings, JsonBs.deserialize(json, clazz));
    }

    文字列Mapテスト
    public void stringTest() {
        Map map = new HashMap<>();
        map.put("123", "456");
    
        final String json = "{\"123\":\"456\"}";
        Assert.assertEquals(json, JsonBs.serialize(map));
        Assert.assertEquals(map, JsonBs.deserialize(json, map.getClass()));
    }

    オブジェクト
    ベースオブジェクトのデモ
  • User.java
  • public class User {
    
        private String name;
    
        private int age;
    
        private double score;
    
        private char sex;
    
        private Date birthday;
    
        //Getter & Setter
        //ToString()
    }
  • テストコード
  • public void userTest() {
        User user = new User();
        user.age(10).name("wiki").birthday(new Date(1568196960491L)).score(123.d).sex('g');
    
        final String json = "{\"name\":\"wiki\",\"age\":10,\"score\":123.0,\"sex\":\"g\",\"birthday\":1568196960491}";
        Assert.assertEquals(json, JsonBs.serialize(user));
    
        User user2 = JsonBs.deserialize(json, User.class);
        Assert.assertEquals(user.toString(), user2.toString());
    }

    拡張読書
    00-jsonとは
    01-モジュールの説明