列表大小为1的Java JSON映射
我正在将一个对象映射到JSON,但是一个名为列表大小为1的Java JSON映射,java,xml,json,jakarta-ee,jaxb,Java,Xml,Json,Jakarta Ee,Jaxb,我正在将一个对象映射到JSON,但是一个名为Parameters的List类型的变量出现问题 相似参数如下所示: @XmlRootElement @XmlAccessorType(XmlAccessType.FIELD) public class SimilarityParameter { private String name; private String type; public SimilarityParameter() { } publi
Parameters
的List
类型的变量出现问题
相似参数
如下所示:
@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;
}
}
@XmlRootElement(name=“AvailableSimilarity”)
@XmlAccessorType(XmlAccessType.FIELD)
公共类相似性信息结果{
私有字符串相似性名称;
私有列表参数;
公共相似性信息结果(){
}
公共相似性信息结果(字符串相似性名称,列表参数){
this.similarityName=similarityName;
此参数=参数;
}
公共字符串getName(){
返回相似性名称;
}
public void setName(字符串相似性名称){
this.similarityName=similarityName;
}
公共列表getParameters(){
返回参数;
}
公共void setParameters(列出参数){
此参数=参数;
}
}
有可能做到这一点吗?注意:我是专家组的负责人和成员 问题是当列表的大小为1时。Mapper逻辑地传输它 致: JAXB规范本身不包含JSON绑定,因此有时实现会与库一起使用,如将XML事件转换为JSON或从JSON转换为XML事件的Destinson,并且会出现问题,例如大小为1的集合被错误表示。这是因为抛弃(和类似的)库只能在它们看到元素多次出现时检测集合
有可能做到这一点吗 JAXB的EclipseLink MOXy实现提供了本机JSON绑定,这意味着大小为1的集合等项将正确转换为JSON jaxb.properties 要将MOXy指定为您的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);
}
}
了解更多信息
{
"parameters" : [ {
"name" : "threshold",
"type" : "Double"
} ]
}