【问题标题】:Send complex Obj (with Map) by POST body - JSON通过 POST 正文发送复杂对象(带地图) - JSON
【发布时间】:2019-08-28 03:29:37
【问题描述】:

我有以下结构的对象:

class MyObject{
    private String firstString;
    private BigDecimal bigDecimal;
    private NestedObject nestedObject;
    private Map<String, String> map;
}

我想通过 Postman 创建一个POST 调用,下面是JSON

{
  "firstString": "first",
  "bigDecimal": 1.2222,
  "nestedObject": {
    "secondString": "second"
  },
  "param1": "paramValue1",
  "param2": "paramValue2",
  "param3": "paramValue3"
}

我也试过了:

{
  "firstString": "first",
  "bigDecimal": 1.2222,
  "nestedObject": {
    "secondString": "second"
  },
  "customMap" :{ 
     "param1": "paramValue1",
     "param2": "paramValue2",
     "param3": "paramValue3"
  }
}

我想将param1param2param3 视为Map 键 - 值,因为参数将是未知的(元素的数量可能是 1 或 1000 ) 我想将其解析为收到此正文后的步骤之一。

NestedObject 是一个具有已知结构的完全嵌套对象。

@POST
@Path("/")
@Produces({MediaType.APPLICATION_JSON})
@Consumes({MediaType.APPLICATION_JSON})
public String getEntity( MyObject myObject){

  //sth
}

当我在调用后完全按照上述方式执行此操作时,我得到 Object 但 map 变量为空。我该如何解决这个问题,您有什么想法吗?

编辑附加信息: @lealceldeiro 您可以在下面找到我的代码,是否有任何“可疑”部分?

import com.fasterxml.jackson.annotation.JsonAnyGetter;
import com.fasterxml.jackson.annotation.JsonAnySetter;
import com.fasterxml.jackson.annotation.JsonIgnore;
import java.util.HashMap;
import java.util.Map;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;

@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
class SearchParamsFromRequest {

    private NestedObject nestedObject;

    private String surname;
    private String type;
    private String userName;

    @JsonIgnore
    private Map<String, Object> additionalProperties = new HashMap<>();

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

    @JsonAnySetter
    public void setAdditionalProperty(String name, Object value) {
        this.additionalProperties.put(name, value);
    }
}
    @POST
    @Path("/")
    @Consumes({MediaType.APPLICATION_JSON})
    public String getString (SearchParamsFromRequest searchParameters){

        return "Any String";
    }

【问题讨论】:

    标签: java rest post jax-rs postman


    【解决方案1】:

    您可以使用com.fasterxml.jackson.annotation 来做到这一点。

    import java.util.HashMap;
    import java.util.Map;
    import com.fasterxml.jackson.annotation.JsonAnyGetter;
    import com.fasterxml.jackson.annotation.JsonAnySetter;
    import com.fasterxml.jackson.annotation.JsonIgnore;
    
    public class MyObject {
    
        private String firstString;
        private BigDecimal bigDecimal;
        private NestedObject nestedObject;
        @JsonIgnore
        private Map<String, Object> map = new HashMap<>();
        // you can change it to Map<String, String> if you know they will always
        // be string - string, be consistent with `setAdditionalProperty`
    
        @JsonAnyGetter
        public Map<String, Object> getMap() {
            return this.map;
        }
    
        @JsonAnySetter
        public void setAdditionalProperty(String name, Object value) {
            this.map.put(name, value);
        }
        // getters and setters omitted
        // REMEMBER to follow the java beans naming conventions
        // for example call the setters and getters such as `setFirstName` and `getFirstName` for the `firstName` attribute
    }
    

    这个 (http://www.jsonschema2pojo.org/) 可以帮助您从 JSON 等源生成您的类。

    【讨论】:

    • 很遗憾在应用您的提案解决方案后map 仍然为空,没有设置任何param。我检查了 3 次 JSON 模式和类模型是否正常,但一切看起来都正确。
    • 嗯...奇怪...请检查private Map&lt;String, Object&gt; mapMap&lt;String, Object&gt; getMap() setAdditionalProperty(String name, Object value) 是否在相同的值上运行? String, Object 他们俩或String, String 他们俩也是。 JsonAnySetter 注释非常清楚地说明了这一点:标记注释,可用于定义一种方法,用作从 JSON 内容中找到的所有其他无法识别的属性的“后备”处理程序
    • 此外,我在不止一个项目中使用过它,而且它一直很有魅力。这里一定有别的东西在干扰。如果您认为还有其他可能导致问题的原因,请尽可能分享。
    猜你喜欢
    • 2018-10-15
    • 1970-01-01
    • 2014-05-20
    • 2011-10-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多