/ / Listet <JAXBElement> im Adaptercode auf, der sich auf das JSON-Format auswirkt - json, xml, jaxb

Listen Sie <JAXBElement> im Adaptercode auf, der sich auf das JSON-Format auswirkt - json, xml, jaxb

Ich möchte die JSON-Ausgabe so formatieren, dass sie nur Zeichenfolgen für Objekte enthält, die nur ein Element und kein Array haben. Unten ist mein POJO.

  @Component("myVO")
@Scope("prototype")
@XmlRootElement
@XmlAccessorType(XmlAccessType.NONE)
@XmlType(propOrder = {"a", "b", "c", "d", "e", "f", "sectionList"})
public class MyVO extends ServiceResponseTO {

private static final long serialVersionUID = -9190950749517871535L;

@XmlElement(name="ABC")
private String a;

@XmlElement(name="DEF")
private String b;

@XmlElement(name="GHI")
private String c;

@XmlElement(name="JKL")
private String d;

@XmlElement(name="MNO")
private String e;

@XmlElement(name="PQR")
private String f;

@XmlElement(name="section")
@XmlJavaTypeAdapter(MyAdapter.class)
private List<Map<String, String>> sectionList ;

//corresponding getters and setters

@Override
public String toString() {
return "DetailsVO [a=" + a + ", b=" + b
+ ", c=" + c + ", d=" + d
+ ", e=" + e + ", f=" + f
+ ", sectionList=" + sectionList+ "]";
}


}

Das Problem ist mit meinem Adaptercode unten.

    class MyAdapter extends XmlAdapter<KeyValuesAsNodeList, Map<String, String>> {
public KeyValuesAsNodeList marshal(Map<String,String> map) throws Exception {
KeyValuesAsNodeList mapType = new KeyValuesAsNodeList();
for(Map.Entry<String,String> entry : map.entrySet()){
if(entry.getKey().equalsIgnoreCase("key1")
mapType.key1 = entry.getValue().toString();

if(entry.getKey().equalsIgnoreCase("key2")
mapType.key2 = entry.getValue().toString();

if(entry.getKey().equalsIgnoreCase("key3")
mapType.key3 = entry.getValue().toString();

if(entry.getKey().equalsIgnoreCase("key3")
mapType.key3 = entry.getValue().toString();

if( entry.getValue().getClass().equals(HashMap.class) || entry.getValue().getClass().equals(LinkedHashMap.class)){
mapType.entries.add(new JAXBElement(new QName(entry.getKey(),String,class,marshal(entry.getValue()))));
}
else{
// For the issue I mentioned.. The value is a string.. so it enters this part. Here the problem lies
mapType.entries.add(new JAXBElement(new QName(entry.getKey(),String,class,entry.getValue())));
}

}
}
}

public Map<String, String> unmarshal(Map<String, String> ) throws Exception {
return null;
}
}



class KeyValuesAsNodeList
{
@XmlAttribute
public String key1 ;

@XmlAttribute
public Integer key2;

@XmlAttribute
public String  key3;

@XmlAttribute
public String key4;
//since I have given JAXBElement as a list, even my strings are retured as an array in JSON.
List<JAXBElement> entries = new ArrayList<JAXBElement>();
}

Wenn ich mit meinem obigen Adapter versuche, in JSON zu konvertieren, wird die Antwort wie folgt gebildet.

{"returnCode":"00","response":{"type":"myVO","ABC":"A","DEF":"B","GHI":"C","JKL":"D","MNO":"E","PQR":"F","section":[{"name":"SectionOne","configuration":"OOO","NAME":["N"],"SECTIONNAME":["A"]}]}}

Die obige Antwort enthält ein JSON-Array, auch für ein einzelnes Element. Ich möchte, dass die obige Ausgabe wie unten dargestellt wird.

Die Antwort, die ich brauche, ist:

{"returnCode":"00","response":{"type":"myVO","ABC":"A","DEF":"B","GHI":"C","JKL":"D","MNO":"E","PQR":"F","section":[{"name":"SectionOne","configuration":"OOO","NAME":"N","SECTIONNAME":"A"}]}}

Ich möchte kein Array für NAME und SECTIONNAME. Ich möchte den Adapter so ändern, dass ich die gewünschte JSON-Ausgabe erhalte und auch mein XML nicht beeinflusst

P.S: Mit diesem Adapter ist meine XML-Antwort perfekt. Jede Hilfe wird geschätzt. Vielen Dank.

Antworten:

0 für die Antwort № 1

Ändern Sie den Datentyp des Abschnittslistenfelds in:

private Map<String, String> sectionList ;

0 für die Antwort № 2

Die Verwendung von Eclipse Moxy löste das Problem. Meine Anforderung bestand darin, die HashMap-Schlüssel als XML-Knoten zu haben. Die Verwendung von @XmlVariableNode anstelle von List hat das Ganze erledigt