Java 反序列化JSON以映射<;字符串,字符串>;使用jackson数据绑定

Java 反序列化JSON以映射<;字符串,字符串>;使用jackson数据绑定,java,spring,rest,jackson,Java,Spring,Rest,Jackson,我正在我的web应用程序中使用spring 4.0.5.RELEASE和jackson databind 2.2.3。 发送此JSON时: {"keyField1":"57579","keyField2":"sdf","someField":"sdasd","parameters":[{"parameterName":"dfgdfg","parameterValue":"sdf"},{"parameterName":"erwer","parameterValue":"sdfsdf"}]} 对于

我正在我的web应用程序中使用spring 4.0.5.RELEASE和jackson databind 2.2.3。 发送此JSON时:

{"keyField1":"57579","keyField2":"sdf","someField":"sdasd","parameters":[{"parameterName":"dfgdfg","parameterValue":"sdf"},{"parameterName":"erwer","parameterValue":"sdfsdf"}]}
对于控制器来说,我得到的只是浏览器上的一个
HTTP 400错误请求
, 我在本地websphere日志中没有看到任何错误,但在一些测试之后,我发现问题在于将JSON数组反序列化到映射。 我从未在控制器上使用过save方法。 尝试了一些注释,如
@jsondeselliate(as=HashMap.class)
,但没有成功。 我如何解决这个问题

我的POJO:

class MyClassId implements Serializable {
private static final long serialVersionUID = 5022985493208399875L;
String keyField1;
String keyField2;
}

@Entity
@IdClass(MyClassId.class)
public class MyClass {
@Id
String keyField1;

@Id
String keyField2;

String someField;

@ElementCollection
@MapKeyColumn(name="parameterName")
@Column(name="parameterValue", length=400)
Map<String, String> parameters;
... Getters and Setters ...
类MyClassId实现可序列化{
私有静态最终长serialVersionUID=5022985493208399875L;
字符串键域1;
字符串键域2;
}
@实体
@IdClass(MyClassId.class)
公共类MyClass{
@身份证
字符串键域1;
@身份证
字符串键域2;
字符串字段;
@元素集合
@MapKeyColumn(name=“parameterName”)
@列(name=“parameterValue”,长度=400)
地图参数;
…能手和二传手。。。
我的控制器:

@RestController
@RequestMapping("/myclass/**")
public class MyClassController {

@Transactional
@RequestMapping(value = "/save", method = RequestMethod.POST, consumes={"application/json"})
public @ResponseBody ServiceResponce<MyClass> save(@RequestBody MyClass processToSave) {
    ... Code ...
}
}
@RestController
@请求映射(“/myclass/**”)
公共类MyClassController{
@交易的
@RequestMapping(value=“/save”,method=RequestMethod.POST,consumes={“application/json”})
public@ResponseBody servicesponse save(@RequestBody MyClass processToSave){
…代码。。。
}
}

在JSON中,
参数
不是一个对象,而是一个对象数组:

"parameters":[{"parameterName":"dfgdfg","parameterValue":"sdf"}, ...
您不能将此映射到地图上

Map<String, String> parameters;
Map参数;
至少使用

List<Map<String, String>> parameters;
列出参数;

我发现有两种方法可以解决您的问题:

  • 您可以将持久化的实体类与发送回客户端的表示类区分开来。缺点是您需要在代码中从实体显式创建表示

  • 如果您使用Jackson在respone(JSON,…)中序列化您的响应,您可以利用它的“自定义序列化程序”功能,根据您的需要调整返回负载的结构。有关更多详细信息,请参阅此答案:

    • Spring 3.2和Jackson 2自定义对象映射器
    • 使用Sprint JavaCconfig注册自定义Jackson对象映射器
    • Restlet复杂对象到XML序列化
希望它能帮助你, Thierry

我的映射只需要包含“dfgdfg”和“sdf”,而不包含“parameterName”和“parameterValue”,它们是常量字符串。