Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/386.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.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
Java 为Json数组创建映射类_Java_Arrays_Json_Jackson - Fatal编程技术网

Java 为Json数组创建映射类

Java 为Json数组创建映射类,java,arrays,json,jackson,Java,Arrays,Json,Jackson,下面给出了Json文件 [ "a", "b", "c" ] 我需要为上面的Json创建POJO类。我试过下面的代码 public class Elements{ public String element; public Elements(String element){ this.element = element; } } public class OuterElement{ Elements[] elements; //Getter and

下面给出了Json文件

[
  "a",
  "b",
  "c"
]
我需要为上面的Json创建POJO类。我试过下面的代码

public class Elements{
  public String element;
  public Elements(String element){
    this.element = element;
  }
}

public class OuterElement{
   Elements[] elements;
   //Getter and Setter
}
但我得到以下例外

com.fasterxml.jackson.databind.JsonMappingException: Can not deserialize instance of [...] out of START_ARRAY token

在这种情况下,POJO类应该如何使用?

您可以使用数组或列表:

[“a”、“b”、“c”]
->字符串[]元素

[“a”、“b”、“c”]
->列出元素

{“元素”:[“a”、“b”、“c”]}
->class YourPOJO
{String[]元素;}


请记住,您需要getter、setter和默认构造函数

您需要创建接受
列表
参数并用
@JsonCreator
注释它的构造函数。下面是一个简单的例子:

import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.databind.ObjectMapper;
import java.util.Arrays;
import java.util.List;

public class Test {

    public static void main(String[] args) throws Exception {
        String json = "[\"a\",\"b\",\"c\"]";

        ObjectMapper mapper = new ObjectMapper();
        OuterElement outerElement = mapper.readValue(json, OuterElement.class);

        System.out.println(outerElement);
    }
}

class Element {

    private String value;

    public Element(String value) {
        this.value = value;
    }

    // getters, setters, toString
}

class OuterElement {

    private Element[] elements;

    @JsonCreator
    public OuterElement(List<String> elements) {
        this.elements = new Element[elements.size()];
        int index = 0;
        for (String element : elements) {
            this.elements[index++] = new Element(element);
        }
    }

    // getters, setters, toString
}

通过您的pojo,我们将获得以下数据

Java代码

OuterElement outerElement=new OuterElement();
        outerElement.setElements(new Elements[]{new Elements("a"),new Elements("b"),new Elements("c")});
和数据

{
    "elements": [
        {
            "element": "a"
        },
        {
            "element": "b"
        },
        {
            "element": "c"
        }
    ]
}
这就是为什么json映射器转换失败的原因,数据映射器期望的是对象,但您提交的是生成
的数组“无法反序列化[…]超出起始\u数组标记的实例”

你可以像下面这样做

public class Elements {

    @JsonProperty("0")
    public String element;

    public String getElement() {
        return element;
    }

    public void setElement(String element) {
        this.element = element;
    }

    public Elements(String element) {
        super();
        this.element = element;
    }



}
您可以使用将JSON解析为POJO

注意,如果您的完整JSON是

[“a”、“b”、“c”]
它只能被解析为列表数组。尝试以不同的方式访问JSON,而不是将其映射到对象。有关示例,请参见@jschnasse's

但是,如果您通常将JSON对象作为

{
  "alphabet": ["a","b","c"]
}
然后将生成下一个POJO:

package com.example;

import java.util.HashMap;
import java.util.List;
import java.util.Map;
import com.fasterxml.jackson.annotation.JsonAnyGetter;
import com.fasterxml.jackson.annotation.JsonAnySetter;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.annotation.JsonPropertyOrder;

@JsonInclude(JsonInclude.Include.NON_NULL)
@JsonPropertyOrder({
        "alphabet"
})
public class Example {

    @JsonProperty("alphabet")
    private List<String> alphabet = null;
    @JsonIgnore
    private Map<String, Object> additionalProperties = new HashMap<String, Object>();

    @JsonProperty("alphabet")
    public List<String> getAlphabet() {
        return alphabet;
    }

    @JsonProperty("alphabet")
    public void setAlphabet(List<String> alphabet) {
        this.alphabet = alphabet;
    }

    @JsonAnyGetter
    public Map<String, Object> getAdditionalProperties() {
        return this.additionalProperties;
    }

    @JsonAnySetter
    public void setAdditionalProperty(String name, Object value) {
        this.additionalProperties.put(name, value);
    }

}
package.com.example;
导入java.util.HashMap;
导入java.util.List;
导入java.util.Map;
导入com.fasterxml.jackson.annotation.JsonAnyGetter;
导入com.fasterxml.jackson.annotation.JsonAnySetter;
导入com.fasterxml.jackson.annotation.JsonIgnore;
导入com.fasterxml.jackson.annotation.JsonInclude;
导入com.fasterxml.jackson.annotation.JsonProperty;
导入com.fasterxml.jackson.annotation.JsonPropertyOrder;
@JsonInclude(JsonInclude.Include.NON_NULL)
@JsonPropertyOrder({
“字母表”
})
公开课范例{
@JsonProperty(“字母表”)
私有列表字母表=空;
@杰索尼奥雷
私有映射additionalProperties=new HashMap();
@JsonProperty(“字母表”)
公共列表getAlphabet(){
返回字母表;
}
@JsonProperty(“字母表”)
公共无效集合字母表(列表字母表){
这个字母表=字母表;
}
@JsonAnyGetter
公共映射getAdditionalProperties(){
返回此。附加属性;
}
@JSONANYSETER
public void setAdditionalProperty(字符串名称、对象值){
this.additionalProperties.put(名称、值);
}
}
package com.example;

import java.util.HashMap;
import java.util.List;
import java.util.Map;
import com.fasterxml.jackson.annotation.JsonAnyGetter;
import com.fasterxml.jackson.annotation.JsonAnySetter;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.annotation.JsonPropertyOrder;

@JsonInclude(JsonInclude.Include.NON_NULL)
@JsonPropertyOrder({
        "alphabet"
})
public class Example {

    @JsonProperty("alphabet")
    private List<String> alphabet = null;
    @JsonIgnore
    private Map<String, Object> additionalProperties = new HashMap<String, Object>();

    @JsonProperty("alphabet")
    public List<String> getAlphabet() {
        return alphabet;
    }

    @JsonProperty("alphabet")
    public void setAlphabet(List<String> alphabet) {
        this.alphabet = alphabet;
    }

    @JsonAnyGetter
    public Map<String, Object> getAdditionalProperties() {
        return this.additionalProperties;
    }

    @JsonAnySetter
    public void setAdditionalProperty(String name, Object value) {
        this.additionalProperties.put(name, value);
    }

}