[CONTAINER-339] [S2Container] JSONSerializer を deprecated にしました.代わりに JSONIC 等を使用してください. Created: 2009-01-23  Updated: 2009-01-29  Resolved: 2009-01-26

Status: Resolved
Project: S2Container
Component/s: S2Container
Affects Version/s: 2.4.33
Fix Version/s: 2.4.34

Type: Bug Priority: Minor
Reporter: masunaga Assignee: koichik
Resolution: Fixed Votes: 0
Labels: None
Environment:

jdk1.6.0_10
Windows XP



 Description   

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)



 Comments   
Comment by koichik [ 2009-01-26 ]

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

Comment by koichik [ 2009-01-26 ]

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

Comment by masunaga [ 2009-01-26 ]

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

Comment by koichik [ 2009-01-26 ]

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

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

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

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

Generated at Tue Apr 16 23:27:12 JST 2024 using Jira 9.15.0#9150000-sha1:9ead8528714127d8cfabf2446010d7e62c0a195c.