使用 jackson 数据绑定将 JSON 反序列化为 Map<String,String>

Deserialize JSON to Map<String,String> using jackson databind

我在我的网络应用程序中使用 spring 4.0.5.RELEASEjackson-databind 2.2.3。 发送此 JSON 时:

{"keyField1":"57579","keyField2":"sdf","someField":"sdasd","parameters":[{"parameterName":"dfgdfg","parameterValue":"sdf"},{"parameterName":"erwer","parameterValue":"sdfsdf"}]}

到控制器,我得到的只是浏览器上的 HTTP 400 Bad Request, 我在本地 websphere 日志中没有看到任何错误,但经过一些测试后我发现问题出在将 JSON 数组反序列化到地图上。 我从来没有进入控制器的保存方法。 尝试了一些像 @JsonDeserialize(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 ...

我的控制器:

@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 ...
}
}

在JSON中,parameters不是对象而是对象数组:

"parameters":[{"parameterName":"dfgdfg","parameterValue":"sdf"}, ...

您不能将其映射到

Map<String, String> parameters;

至少使用

List<Map<String, String>> parameters;

我看到两个解决你问题的方法:

  • 您区分实体 class 持久化到发送回客户端的表示 class。缺点是您需要在实体代码中明确创建表示

  • 如果您使用 Jackson 在响应中序列化您的响应 (JSON, ...),您可以利用它的特性 "custom serializer" 来调整返回的结构有效载荷根据您的需要。有关详细信息,请参阅此答案:

希望对你有帮助, 蒂埃里