【问题标题】:[Spring]: Request mapping nested Json with array inside it[Spring]:请求映射嵌套的 Json,其中包含数组
【发布时间】:2017-05-02 20:22:43
【问题描述】:

我有一个请求正文,

 {
    "first": "0",
    "second": "3",
    "third": {
        "Types": ["AAA"],
        "Name": "XXXX"
    }
 }

我无法使用 spring 将其映射到请求映射。我尝试了以下方法,但没有成功。

公共类 requestMap {

private Integer skip;
private Integer take;
private Map<String, String[]> keywords;

public Integer getSkip() {
    return skip;
}

public void setSkip(Integer skip) {
    this.skip = skip;
}

public Integer getTake() {
    return take;
}

public void setTake(Integer take) {
    this.take = take;
}

public Map<String, String[]> getKeywords() {
    return keywords;
}

public void setKeywords(Keywords keywords) {
    this.keywords = (Map<String, String[]>) keywords;
}

}

如何映射请求正文?

编辑 Json 中区分大小写的键。

【问题讨论】:

  • 关键字不应该是一个数组,关键字应该是一个持有类型数组的对象。

标签: java spring spring-mvc


【解决方案1】:

这应该是正确的模型。

public class jsonObject
{
    private Keywords keywords;

    private String take;

    private String skip;

    public Keywords getKeywords ()
    {
        return keywords;
    }

    public void setKeywords (Keywords keywords)
    {
        this.keywords = keywords;
    }

    public String getTake ()
    {
        return take;
    }

    public void setTake (String take)
    {
        this.take = take;
    }

    public String getSkip ()
    {
        return skip;
    }

    public void setSkip (String skip)
    {
        this.skip = skip;
    }

    @Override
    public String toString()
    {
        return "ClassPojo [keywords = "+keywords+", take = "+take+", skip = "+skip+"]";
    }
}

//keywords class

public class Keywords
{
    private String name;

    private String[] types;

    public String getName ()
    {
        return name;
    }

    public void setName (String name)
    {
        this.name = name;
    }

    public String[] getTypes ()
    {
        return types;
    }

    public void setTypes (String[] types)
    {
        this.types = types;
    }

    @Override
    public String toString()
    {
        return "ClassPojo [name = "+name+", types = "+types+"]";
    }
}

【讨论】:

    【解决方案2】:

    在您的映射中将String[] 更改为Object,因为keywords 可以有一个数组或一个字符串,而不仅仅是数组,例如name 对有一个字符串值(并且不能映射为一个数组)和@ 987654325@ 有一个数组值。 所以应该是:

     private Map<String, Object> keywords;
    

    否则,最好的选择是创建一个包含 wrappes 关键字的对象,使用 json 属性进行注释,因此您的属性以大写开头:

     class Keywords {
          @JsonProperty("Types")
          List<String> types;
          @JsonProperty("Name")
          String name;
       }
    

    然后用它代替地图。


    如果您能够更改 json,您的关键字 pairs-values 可能是一个数组:

    "keywords": {
        "types": ["P-A01"],
        "name": ["XXXX"]
    }
    

    然后您将能够像您的示例一样使用关键字映射:

     Map<String, String[]> keywords;
    

    当然,您应该知道键 name 将有一个长度为 1 的数组。

    【讨论】:

    • 关键字不代表array,关键字应该是包含array类型strings的对象。
    • 是的,我就是这么说的,可能解释得不好
    • 当我将键首字母作为大写时,逻辑不起作用。如“{类型”:[“P-A01”],“名称”:“XXXX”}
    • 你有可能有类型和类型,还是只有大写的类型?我已经更新了我的答案。带有注释的类关键字来解决它。如果改为使用映射,它将使用键类型和名称进行映射。
    猜你喜欢
    • 1970-01-01
    • 2021-12-15
    • 2017-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-08
    • 2019-05-01
    相关资源
    最近更新 更多