• Type: Bug
    • Resolution: Fixed
    • Priority: 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)

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

          koichik added a comment -

          JSONSerializer を deprecated にしました.
          http://svn.seasar.org/browse/?view=rev&root=s2container&revision=4227

          koichik added a comment - JSONSerializer を deprecated にしました. http://svn.seasar.org/browse/?view=rev&root=s2container&revision=4227

          koichik added a comment -

          ありがとうございます.
          この issue は JSONSerializer を @deprecated にするという対応で fix とさせていただきます.

          koichik added a comment - ありがとうございます. この issue は JSONSerializer を @deprecated にするという対応で fix とさせていただきます.

          masunaga added a comment -

          ご調査いただき、また注意点につきましてもご教示いただきまして誠にありがとうございました。
          JSONICを使う方向で対応したいと思います。

          masunaga added a comment - ご調査いただき、また注意点につきましてもご教示いただきまして誠にありがとうございました。 JSONICを使う方向で対応したいと思います。

          koichik added a comment -

          JSONSerializer の実装ですが,率直に言って実用レベルとは言い難く,きちんと対応するとなると現在の実装を捨てて書き直す必要があります.

          大変申し訳ありませんが,JSONIC 等他のライブラリの使用を検討いただけないでしょうか.
          http://jsonic.sourceforge.jp/

          JSONSerializer は @deprecated とさせていただきたいと考えています.

          注意点として,JSONSerializer は文字列にダブルクオートに加えてシングルクオートも許していますが,正式な JSON の仕様ではダブルクオートのみが許されています.
          http://json.org/json-ja.html
          http://tools.ietf.org/html/rfc4627
          文字列にシングルクオートを使っている場合は修正が必要となる可能性があります.

          koichik added a comment - JSONSerializer の実装ですが,率直に言って実用レベルとは言い難く,きちんと対応するとなると現在の実装を捨てて書き直す必要があります. 大変申し訳ありませんが,JSONIC 等他のライブラリの使用を検討いただけないでしょうか. http://jsonic.sourceforge.jp/ JSONSerializer は @deprecated とさせていただきたいと考えています. 注意点として,JSONSerializer は文字列にダブルクオートに加えてシングルクオートも許していますが,正式な JSON の仕様ではダブルクオートのみが許されています. http://json.org/json-ja.html http://tools.ietf.org/html/rfc4627 文字列にシングルクオートを使っている場合は修正が必要となる可能性があります.

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

              Created:
              Updated:
              Resolved: