2013-01-10 6 views
1

저는 XStream을 사용하여 JSON을 다시 Java 객체로 매핑합니다.XStream을 입력 된 목록으로 다시 매핑하는 방법은 무엇입니까?

{ 
    "widgets":[ 
    { 
     "widget_name": "Kenny", 
     "widget_type": "Character" 
    }, 
     "widget_name": "Apple", 
     "widget_type": "Fruit" 
    } 
    ] 
} 

업데이트 : 나는 다음과 같을 수 JSON 문자열을 처리 할 수 ​​있습니다 내가이 JSON을 생각 하는 것으로 해석 될 수있다 :

이 JSON은 이름이 지정되지 않은 나타냅니다 widgets 개체를 포함하는 개체입니다. widgets 개체에는 다른 이름이 지정되지 않은 개체 배열이 차례로 들어 있습니다. 이러한 이름이 지정되지 않은 각 객체에는 widget_namewidget_type의 두 속성이 있습니다. 이 widgetlist에서

Widget는 POJO에 해당

public class Widget { 
    private String name; 
    private String type; 

    // ...etc. 
} 

내가 다시 List<Widget>에 매핑 위의 JSON 문자열을하고 싶습니다,하지만 난 별칭을하는 방법을 알아낼 수없는 것 제대로 클래스 :

XStream xs = new XStream(); 
xs.alias("widgetlist", List.class); // Not a List<Widget> ! 

은 어떻게 xs 매퍼는로 widgetlist 번역을 얻을 수 있습니다? 미리 감사드립니다.

답변

2

이 코드는 저에게 효과적이지만, 생성 된 JSON은 가지고있는 코드와 유사하지 않습니다. JettisonMappedXmlDriver 대신 JsonHierarchicalStreamDriver을 사용한다면 귀하의 질문과 동일한 JSON을 얻을 수 있습니다. 단점은 JsonHierarchicalStreamDriver에서 JSON을 읽을 수 없다는 것이며 시도하면 UnsupportedOperationException이 표시된다는 것입니다. (만약 당신이 좋아하면 이름이 지정되지 않은 객체)

XStream xstream = new XStream(new JettisonMappedXmlDriver()); 
xstream.setMode(XStream.NO_REFERENCES); 
xstream.alias("widgetlist", List.class); 
xstream.alias("widget", Widget.class); 
List<Widget> widgetlist = new ArrayList<Widget>(); 
Widget w1 = new Widget("Kenny", "Character"); 
Widget w2 = new Widget("Apple", "Fruit"); 
widgetlist.add(w1); 
widgetlist.add(w2); 
String serialized = xstream.toXML(widgetlist); 
System.out.println(serialized); 
List<Widget> unserialized = (List<Widget>)xstream.fromXML(serialized); 
System.out.println("Size: "+unserialized.size()); 

생성 된 XML

해석

{ 
    "widgetlist": { 
     "widget": [ 
      { 
       "name": "Kenny", 
       "type": "Character" 
      }, 
      { 
       "name": "Apple", 
       "type": "Fruit" 
      } 
     ] 
    } 
} 

JettionMappedXmlDriver에 의해 json으로는 JSON 아래의 DROP_ROOT_MODE 버전입니다. 따라서Widget목록을 포함하는 이름이없는 개체로 볼 수 있습니다. Widget 개체는 여전히 질문에서 설명한 것과 같은 구조를가집니다.

public class WidgetList { 
    List<Widget> widgets; 

    public WidgetList() { 
     this.widgets = new ArrayList<>(); 
    } 
} 

XStream을 설정

xstream.setMode(XStream.NO_REFERENCES); 
    xstream.alias("widgets", List.class); 
    xstream.addImplicitCollection(WidgetList.class, "widgets"); 
    xstream.alias("widgets", Widget.class); 
    xstream.alias("widgetsL", WidgetList.class); 

JSON 출력

{ 
    "widgetsL": { 
     "widgets": [ 
      { 
       "name": "Kenny", 
       "type": "Character" 
      }, 
      { 
       "name": "Apple", 
       "type": "Fruit" 
      } 
     ] 
    } 
} 
+0

감사 @atomman (+1) - Unofrtunately, 나는 깨달았다 오늘 아침의 상단에 내 JSON 문자열 내 질문이 올바르지 않아서 실제 (올바른) JSON을 반영하도록 편집했습니다. – IAmYourFaja

+1

글쎄, 내가 볼 수있는 유일한 방법은 JSON이'JsonHierarchicalStreamDriver'와'DROP_ROOT' 모드가 활성화 된 것을 재현 할 수 있다는 것입니다. 그러나 대답에서 말했듯이,이'Driver '는 비 직렬화를 지원하지 않습니다.불행히도,'JettisonMappedXmlDriver'는 엄격한 구조가 필요하기 때문에이 모드를 지원하지 않습니다. '{ "ObjectName": { "fieldName": "fieldValue", "fieldName2": "fieldValue"}}'. 죄송합니다. 현재 JSON으로 솔루션을 찾을 수 없으므로 JSON 구조를 변경하거나 사용자 정의 StaxReader로 직접 구문 분석하는 것이 좋습니다. – atomman

+0

충분히 공정하게! JSON을 변경해 보겠습니다. 마지막 하나의 후속 조치 : 원래 질문을 JSON 예제가 나타내는 것으로 해석 한 것으로 업데이트했습니다. 그 설명을 읽고 내가 틀렸다면 나에게 틀렸다고 말해 줄 수 있습니까? 지금까지 (그리고 다시 +1) 모든 도움에 다시 한번 감사드립니다! – IAmYourFaja