2013-07-08 2 views
2

를 직렬화 할 수없는 나는 직렬화와 다음과의 LinkedHashMap 데이터를 deseriliaze하려고 :플렉스 JSON가 제대로 역 직렬화 /의 LinkedHashMap

LinkedHashMap<String, Object> o = new LinkedHashMap<String, Object>(); 
o.put("1", "a"); 
o.put("2", "b"); 
o.put("3", "c"); 
o.put("4", new BigDecimal("9999999999999999999999.00999999999999999999999")); 

String serialize = new JSONSerializer().deepSerialize(o); 
System.out.println("serialize" + serialize); 

LinkedHashMap deserialize = new JSONDeserializer<LinkedHashMap>().deserialize(serialize, LinkedHashMap.class); 
System.out.println("deserialize:" + deserialize); 

나는 ClassCastException이 얻을 : 직렬화 복원 할 때

serialize{"1":"a","2":"b","3":"c","4":9999999999999999999999.00999999999999999999999} 
Exception in thread "main" java.lang.ClassCastException: java.util.HashMap cannot be cast to java.util.LinkedHashMap 
    at com.JSONUtil.main(JSONUtil.java:161) 

그래서 나는 약간 다른 접근을 시도 다음과 같이하십시오 :

HashMap deserialize = new JSONDeserializer<HashMap>().deserialize(serialize, HashMap.class); 
System.out.println("deserialize:" + deserialize); 

이번에는 결과가 나오지만 맵은 정렬되지 않았습니다. (저는 HashMap을 사용하고 있기 때문에 생각합니다). 또한 BigDecimal 값은 원래 형식과 같이 표시되지 않습니다.

deserialize:{3=c, 2=b, 1=a, 4=1.0E22} 

FlexJSON에는 정렬 된지도에 문제가있는 것으로 보입니다. 이것은 아래 예와 같이 'class'항목을 넣을 방법이 없기 때문에 이것이라고 생각합니다.

"class":"ch.qos.logback.classic.Logger","debugEnabled":true,"errorEnabled":true,"infoEnabled":true} 

또는 다른 방법이 있습니다. 아무도 도와 줄 수 있습니까? chubbsondubs에 의해 제안 는 ObjectFactory를 도입 한 후


감사합니다

LinkedHashMap deserialize = new JSONDeserializer<LinkedHashMap>() 
.use(LinkedHashMap.class, new ObjectFactory() { 
public Object instantiate(ObjectBinder context, Object value, Type targetType, Class targetClass) { 
    System.out.println("mymap:"value); 
} 
}).deserialize(serialize, LinkedHashMap.class); 

값 객체가 HashMap의 유형을 가지고 있으며 인쇄 :

mymap:{3=c, 2=b, 1=a, [email protected]} 

답변

2

기본적으로 객체 정보는 입력하지 않고 문서에서 설명하는 HashMap로 해석됩니다. HashMap을 사용하지 않는 시간은 포함 된 클래스 속성 (작동하지만 네트워크를 통해 안전하지 않음), 객체 경로별로 지정된 유형 또는 객체를 비 직렬화하려는 경우 형태를 해석 할 수있는 형 객체.

표준 컬렉션과 마찬가지로 클래스는 런타임에 간단한 객체 참조이기 때문에 Flexjson이 Collection/Map 클래스에서 포함 된 유형을 유추 할 수있는 방법이 없습니다. 숫자는 JSON이 유형 정보를 지정하지 않는 또 다른 영역입니다. byte, short, int, long, BigInteger, float, double, BigDecimal 등 여러 가지 유형 중 하나 일 수있는 Java에 숫자를 매핑 할 때. 입력 정보가 ​​지정되지 않은 경우 Flexjson에서 전화를 걸어야합니다. 기본적으로 double은 십진수이면 double을 사용하고 정수인 경우 long을 사용합니다. 귀하의 경우에는 이중이므로 지수 형식으로 표시됩니다.

원하는 유형을 지정해야합니다. 형식화 된 객체를 사용하거나 객체 경로에 유형을 구성하거나 사용자 정의 ObjectFactory를 작성합니다. ObjectFactory는 입력 된 객체를 만들 수있는 경우를 제외하고는 사용자에게 유일한 옵션이라고 생각합니다. 이유는 Map의 값의 유형이 다양하기 때문입니다. 몇개의 엔트리는, string가 다른 경우는 BigDecimal입니다. 따라서 LinkedHashMap을 인스턴스화하고 소스의 값이 JsonNumber이면 모든 키를 소스에서 대상으로 복사하여 BigDecimal로 변환하는 특수 ObjectFactory를 가져야합니다.

+0

감사하지만지도 정렬이 이미 변경되었습니다. 상단의 편집 된 주석을 확인하십시오. –

+0

ObjectFactory에서 실제로 아무것도하지 않았기 때문입니다. 당신이 쓴 것은 HashMap (순서가 없음)입니다. flexjson은 HashMap을 ObjectFactory가 생성 한 객체에 바인딩하기 전에 파싱합니다. ObjectFactory 내부에서 인스턴스화하고 값을 그 안에 옮겨서 LinkedHashMap으로 변환해야합니다. – chubbsondubs