Gson解析json時にExpected a string but was BEGIN_が現れるARRAY異常によりGsonとFastJsonの違いが発見された

3815 ワード

Gsonで1段のjsonを解析して、1つの属性をStringと定義して、すべてのデータ型を受信しようとして、解析したStringを手に入れてから処理して、結果はこの異常に遭遇した. 
この異常はみんな出会ったことがあるはずです.私たちが定義したオブジェクトのある属性はstringタイプですが、jsonではArrayタイプです.
これは,Gsonではキーワードの後ろに「」が現れることによって引き起こされるコンテンツはSTRINGとしか考えられず,「{}」はクラスとしか考えられず,「[]」はリストとしか考えられず,これはほとんど強制的であるからである.
つまり、エンティティがStringの変数を取得すると予想されていますが、キーワードの後ろに対応する「{」または「[」が表示されると、この変換はエラーとみなされ、例外が放出されます.
以前使っていたFastJsonにはこのような問題は存在しないようだと思い、テストをしました.
@Test
    public void jsonTest(){
        // json  
        File file=new File("C://data.json");
        //    String
        String data=readToString(file.getAbsolutePath());

        // fastjson  
        useFastJson(data);
        // Gson  
        useGson(data);
    }

    /**
     *  fastjson  
     * @param data
     */
    private void useFastJson(String data){
        Article article= JSON.parseObject(data, Article.class);
        System.out.println(article.getDetail());
    }

    /**
     *  Gosn   
     * @param data
     */
    private void useGson(String data){
        Article article= new Gson().fromJson(data,Article.class);
        System.out.println(article.getDetail());
    }

/**
     *      String
     * @param fileName
     * @return
     */
    public static String readToString(String fileName) {
        String encoding = "UTF-8";
        File file = new File(fileName);
        Long filelength = file.length();
        byte[] filecontent = new byte[filelength.intValue()];
        try {
            FileInputStream in = new FileInputStream(file);
            in.read(filecontent);
            in.close();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        try {
            return new String(filecontent, encoding);
        } catch (UnsupportedEncodingException e) {
            System.err.println("The OS does not support " + encoding);
            e.printStackTrace();
            return null;
        }
    }
  :
[{"catalog":"    ","article":[{"read":1,"column":9,"id":2,"title":"IntelliJIDEA    ","slug":"static/kotlin_article/0_1.html"},{"read":1,"column":9,"id":3,"title":"Eclipse    ","slug":"static/kotlin_article/0_2.html"},{"read":1,"column":9,"id":4,"title":"       ","slug":"static/kotlin_article/0_3.html"},{"read":1,"column":9,"id":5,"title":"Android    ","slug":"static/kotlin_article/0_4.html"}]}]

com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected a string but was BEGIN_ARRAY at line 2 column 16 path $.detailcom.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected a string but was BEGIN_ARRAY at line 2 column 16 path $.detailat com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:224)at com.google.gson.Gson.fromJson(Gson.java:888)at com.google.gson.Gson.fromJson(Gson.java:853)at com.google.gson.Gson.fromJson(Gson.java:802)at com.google.gson.Gson.fromJson(Gson.java:774)at per.wsj.myapplication.ExampleUnitTest.useGson(ExampleUnitTest.java:60)at per.wsj.myapplication.ExampleUnitTest.jsonTest(ExampleUnitTest.java:43)at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)at java.lang.reflect.Method.invoke(Method.java:498)
Fastjson ,