Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
列表大小为1的Java JSON映射_Java_Xml_Json_Jakarta Ee_Jaxb - Fatal编程技术网

列表大小为1的Java 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

我正在将一个对象映射到JSON,但是一个名为
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);
    }

}
了解更多信息


您应该告诉问题标签中的JSON封送器是什么。
{
   "parameters" : [ {
      "name" : "threshold",
      "type" : "Double"
   } ]
}