适配器代码中的列表 <JAXBElement> 影响 JSON 格式
List<JAXBElement> in adapter code impacting JSON format
我想将 json 输出格式化为仅包含只有一个元素而不是数组的对象的字符串。下面是我的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+ "]";
}
}
问题出在我下面的适配器代码上。
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>();
}
使用我上面的适配器,如果我尝试转换为 JSON,响应如下。
{"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"]}]}}
以上响应包含 JSON 数组,即使对于单个元素也是如此。我希望上面的输出像下面这样形成。
我需要的回复是:
{"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"}]}}
我不需要 NAME 和 SECTIONNAME 的数组。我想以这样一种方式更改适配器,以获得所需的 JSON 输出并且不会影响我的 XML
P.S:有了这个,适配器,我的 XML 反应是完美的。
任何帮助表示赞赏。谢谢。
将 sectionList 字段的数据类型更改为:
private Map<String, String> sectionList ;
使用 Eclipse Moxy 解决了这个问题。我的要求是将 HashMap 键作为 XML 节点。使用 @XmlVariableNode 而不是 List 完成了整个事情
我想将 json 输出格式化为仅包含只有一个元素而不是数组的对象的字符串。下面是我的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+ "]";
}
}
问题出在我下面的适配器代码上。
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>();
}
使用我上面的适配器,如果我尝试转换为 JSON,响应如下。
{"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"]}]}}
以上响应包含 JSON 数组,即使对于单个元素也是如此。我希望上面的输出像下面这样形成。
我需要的回复是:
{"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"}]}}
我不需要 NAME 和 SECTIONNAME 的数组。我想以这样一种方式更改适配器,以获得所需的 JSON 输出并且不会影响我的 XML
P.S:有了这个,适配器,我的 XML 反应是完美的。 任何帮助表示赞赏。谢谢。
将 sectionList 字段的数据类型更改为:
private Map<String, String> sectionList ;
使用 Eclipse Moxy 解决了这个问题。我的要求是将 HashMap 键作为 XML 节点。使用 @XmlVariableNode 而不是 List 完成了整个事情