Uploaded image for project: 'S2Container'
  1. S2Container
  2. CONTAINER-339

[S2Container] JSONSerializer を deprecated にしました.代わりに JSONIC 等を使用してください.

XMLWordPrintable

    • Type: Icon: Bug Bug
    • Resolution: Fixed
    • Priority: Icon: Minor Minor
    • 2.4.34
    • Affects Version/s: 2.4.33
    • Component/s: S2Container
    • None
    • Environment:
      jdk1.6.0_10
      Windows XP

      JSON文字列で与えられるデータの最後に配列があるとJSONSerializer解析に失敗する

      例)
      JSONSerializer.eval(JSON文字列)において

      {"list1":["value3","value4"],"str1":"value1","str2":"value2"}

      は正しく解析してlist1を取得できるが、並び順をかえた

      {"str1":"value1","str2":"value2","list1":["value3","value4"]}

      は解析に失敗して
      List<String> list11 = (List<String>)obj1.get("list1");
      をしようとするとClassCastExceptionが発生する。

      利用上の暫定的なワークアラウンドとしてはデータの順番を変えるか、配列の後ろに
      ダミーデータ"dummy":"dummy"をつけて配列が最後にならないようにする方法がある。

      // Issue再現用テストコード

      package test;

      import java.util.HashMap;
      import java.util.List;

      import org.seasar.framework.util.JSONSerializer;

      public class JSONSerializerBugTest {
      /**

      • JSONデータ並び順で最後にListがあるとJSONSerializerがJSON解析に失敗する
        */
        public static void main(String[] args) {
        // JSONデータ並び順 List<String>,String,String の場合
        String jsonData1 = " {\"list1\":[\"value3\",\"value4\"],\"str1\":\"value1\",\"str2\":\"value2\"}

        ";
        System.out.println("jsonData1="+jsonData1);
        HashMap obj1 = (HashMap)JSONSerializer.eval(jsonData1);

      String str11 = (String)obj1.get("str1");
      System.out.println("obj1.str1="+str11);

      String str12 = (String)obj1.get("str2");
      System.out.println("obj1.str2="+str12);

      List<String> list11 = (List<String>)obj1.get("list1");
      System.out.println("obj1.list1="+list11);

      // JSONデータ並び順 String,String,List<String> の場合
      String jsonData2 = "

      {\"str1\":\"value1\",\"str2\":\"value2\",\"list1\":[\"value3\",\"value4\"]}

      ";
      System.out.println("jsonData2="+jsonData2);
      HashMap obj2 = (HashMap)JSONSerializer.eval(jsonData2);

      String str21 = (String)obj2.get("str1");
      System.out.println("obj2.str1="+str21);

      String str22 = (String)obj2.get("str2");
      System.out.println("obj2.str2="+str22);

      List<String> list21 = (List<String>)obj2.get("list1");
      System.out.println("obj2.list1="+list21);
      }
      }

      // テストコード実行結果

      jsonData1=

      {"list1":["value3","value4"],"str1":"value1","str2":"value2"}

      obj1.str1=value1
      obj1.str2=value2
      obj1.list1=[value3, value4]
      jsonData2=

      {"str1":"value1","str2":"value2","list1":["value3","value4"]}

      obj2.str1=value1
      obj2.str2=value2
      Exception in thread "main" java.lang.ClassCastException: java.lang.String cannot be cast to java.util.List
      at test.JSONSerializerBugTest.main(JSONSerializerBugTest.java:39)

            Assignee:
            koichik koichik
            Reporter:
            masunaga masunaga
            Votes:
            0 Vote for this issue
            Watchers:
            0 Start watching this issue

              Created:
              Updated:
              Resolved: