列表大小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得到获得包含nametype阵列。它会导致客户端不一致。

我想尺寸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; 
    } 


} 

是否有可能实现这一目标?

+1

你应该告诉你的JSON编组是在问题的标签是什么。 – 2013-03-09 22:02:43

+0

它现在设置... – Macejkou 2013-03-10 13:28:36

备注:我是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" 
    } ] 
} 

更多信息