2012-02-28 2 views
13

У меня есть ответ JSON, который выглядит следующим образом:JAXB java.util.Map связывания

{ 
    "data": [ 
     { 
      "param1": "value1", 
      "param2": "value2", 
        . 
        . 
        . 
      "paramN": "valueN" 
     } 
    ] 
} 

Я не знаю, имя и число параметров. Итак, мне нужно и нужно связать все эти параметры с полем java.util.Map, состоящим из < «paramX», «valueX»> кортежей. Чтобы сделать это, я попробовал следующий код, но поле «parametersMap» возвращает значение null.

@XmlRootElement(name="data") 
@XmlAccessorType(XmlAccessType.FIELD) 
public class Parameters { 
    @XmlElement 
    private Map<String,String> parametersMap; 

    // Getter and setter for parametersMap 
} 

Как я могу добиться такого связывания с аннотациями JAXB?

Заранее спасибо.

+0

Из другого сообщения я только что узнал, что * джерси * (re) использует * JAXB * аннотации. http://stackoverflow.com/questions/1261593/binding-a-json-to-a-java-class-using-jaxb –

+1

Да, JAXB предназначен для привязки XML, но он также может использоваться для привязки входов JSON к объектам Java вместе с Джерси. – ovunccetin

+0

EclipseLink JAXB (MOXy) также предлагает привязку JSON, использующую аннотации JAXB: http://blog.bdoughan.com/2011/08/json-binding-with-eclipselink-moxy.html –

ответ

7

В принципе вам нужен адаптер xml. Вы можете играть с именами в классе KeyValue, чтобы получить желаемый результат.

Parameter.java

import javax.xml.bind.annotation.XmlAccessType; 
import javax.xml.bind.annotation.XmlAccessorType; 
import javax.xml.bind.annotation.XmlRootElement; 
import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter; 
import java.util.Map; 

@XmlRootElement(name = "data") 
@XmlAccessorType(XmlAccessType.FIELD) 
public class Parameters { 

    @XmlJavaTypeAdapter(value = Adapter.class) 
    private Map<String, String> parametersMap; 

    // Getter and setter for parametersMap 
} 

Adapter.java

import javax.xml.bind.annotation.adapters.XmlAdapter; 
import java.util.ArrayList; 
import java.util.HashMap; 
import java.util.List; 
import java.util.Map; 
import java.util.Set; 

public class Adapter extends XmlAdapter<List<KeyValue>, Map<String, String>> { 

    @Override 
    public Map<String, String> unmarshal(List<KeyValue> v) throws Exception { 
     Map<String, String> map = new HashMap<>(v.size()); 
     for (KeyValue keyValue : v) { 
      map.put(keyValue.key, keyValue.value); 
     } 
     return map; 
    } 

    @Override 
    public List<KeyValue> marshal(Map<String, String> v) throws Exception { 
     Set<String> keys = v.keySet(); 
     List<KeyValue> results = new ArrayList<>(v.size()); 
     for (String key : keys) { 
      results.add(new KeyValue(key, v.get(key))); 
     } 
     return results; 
    } 
} 

KeyValue.java Положите лучшие теги JAXB здесь, очевидно.

import javax.xml.bind.annotation.XmlType; 

@XmlType 
public class KeyValue { 
    public KeyValue() { 
    } 

    public KeyValue(String key, String value) { 
     this.key = key; 
     this.value = value; 
    } 

    //obviously needs setters/getters 
    String key; 
    String value; 
} 
+0

Я получаю 'com.sun.xml.bind.v2.runtime.IllegalAnnotationsException: 1 счетчик IllegalAnnotationExceptions' для' Parameters.java' в строке, где объявляется 'Map'. – koppor

+1

Ответ https://www.tomasmalmsten.com/2012/05/unmarshall-marshall-java-maps-xml-jaxb/ wraps 'List ' в другом вспомогательном классе. Это предотвращает «IllegalAnnotationsException». – koppor

Смежные вопросы