-
Type:
Bug
-
Resolution: Fixed
-
Priority:
Minor
-
Affects Version/s: 2.4.33
-
Component/s: S2Container
-
None
-
Environment:jdk1.6.0_10
Windows XP
JSON文字列で与えられるデータの最後に配列があるとJSONSerializer解析に失敗する
例)
JSONSerializer.eval(JSON文字列)において
は正しく解析して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 = "
";
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=
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)
JSONSerializer を deprecated にしました.
http://svn.seasar.org/browse/?view=rev&root=s2container&revision=4227