列表大小1的Java JSON映射
问题描述:
我正在将对象映射到JSON,并且有一个类型为List <SimilarityParameter>
的名为Parameters
的变量出现问题。列表大小1的Java JSON映射
SimilarityParameter
看起来是这样的:
@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class SimilarityParameter {
private String name;
private String type;
public SimilarityParameter() {
}
public SimilarityParameter(String name, String type) {
this.name = name;
this.type = type;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
}
当此列表很大一切正常。该JSON看起来像这样
{
"parameters":[
{
"name":"threshold",
"type":"Double"
},
{
"name":"numberOfResults",
"type":"Integer"
}
]
}
这是可以的,因为在客户端JSON编码后,我有参数的数组。
问题是当列表的大小为1映射器将其传送的逻辑到:
{
"parameters":{
"name":"numberOfResults",
"type":"Integer"
}
}
当客户端解码这个JSON得到获得包含name
和type
阵列。它会导致客户端不一致。
我想尺寸1的映射列表,以这样的:
{
"parameters":[
{
"name":"threshold",
"type":"Double"
}
]
}
所以编码含有一个参数阵列之后。
这是响应的样子:
@XmlRootElement(name = "availableSimilarities")
@XmlAccessorType(XmlAccessType.FIELD)
public class SimilarityInfoResult {
private String similarityName;
private List <SimilarityParameter> parameters;
public SimilarityInfoResult() {
}
public SimilarityInfoResult(String similarityName, List<SimilarityParameter> parameters) {
this.similarityName = similarityName;
this.parameters = parameters;
}
public String getName() {
return similarityName;
}
public void setName(String similarityName) {
this.similarityName = similarityName;
}
public List<SimilarityParameter> getParameters() {
return parameters;
}
public void setParameters(List<SimilarityParameter> parameters) {
this.parameters = parameters;
}
}
是否有可能实现这一目标?
答
备注:我是EclipseLink JAXB (MOXy)的领导者和JAXB (JSR-222)专家组的成员。
问题是当列表的大小为1映射器转移它在逻辑 到:
的JAXB规范本身不覆盖JSON结合所以有时实现用相同的抛弃用于图书馆它将XML事件转换为JSON或从JSON转换到XML,并且会发生问题,例如大小为1的集合被错误地表示。这是因为Jettison(以及类似的)库只能在看到一个元素出现多次时才能检测集合。
是否有可能实现这一目标?
的的EclipseLink莫西实施JAXB的提供原生JSON结合的意义,像大小为1的集合项目将在适当转换成JSON。
jaxb。性能
要指定莫西为您的JAXB提供你需要包括一个在同一封装称为jaxb.properites
为您的域模型具有以下项文件:
javax.xml.bind.context.factory=org.eclipse.persistence.jaxb.JAXBContextFactory
演示
import java.util.*;
import javax.xml.bind.*;
import javax.xml.transform.stream.StreamSource;
import org.eclipse.persistence.jaxb.JAXBContextProperties;
public class Demo {
public static void main(String[] args) throws Exception {
Map<String, Object> properties = new HashMap<String, Object>(2);
properties.put(JAXBContextProperties.MEDIA_TYPE, "application/json");
properties.put(JAXBContextProperties.JSON_INCLUDE_ROOT, false);
JAXBContext jc = JAXBContext.newInstance(new Class[] {SimilarityInfoResult.class}, properties);
Unmarshaller unmarshaller = jc.createUnmarshaller();
StreamSource json = new StreamSource("src/forum15316288/input.json");
SimilarityInfoResult result = unmarshaller.unmarshal(json, SimilarityInfoResult.class).getValue();
Marshaller marshaller= jc.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
marshaller.marshal(result, System.out);
}
}
input.json /输出
{
"parameters" : [ {
"name" : "threshold",
"type" : "Double"
} ]
}
更多信息
你应该告诉你的JSON编组是在问题的标签是什么。 – 2013-03-09 22:02:43
它现在设置... – Macejkou 2013-03-10 13:28:36