使用 jackson 数据绑定将 JSON 反序列化为 Map<String,String>
Deserialize JSON to Map<String,String> using jackson databind
我在我的网络应用程序中使用 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 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" 来调整返回的结构有效载荷根据您的需要。有关详细信息,请参阅此答案:
- Spring 3.2 和 Jackson 2 自定义对象映射器 - Spring 3.2 and Jackson 2: add custom object mapper
- 使用 Sprint JavaCconfig 注册自定义 Jackson ObjectMapper - http://magicmonster.com/kb/prg/java/spring/webmvc/jackson_custom.html
- Restlet 复杂对象到 XML 序列化 - Restlet Complex Object to XML serializaton
希望对你有帮助,
蒂埃里
我在我的网络应用程序中使用 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 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" 来调整返回的结构有效载荷根据您的需要。有关详细信息,请参阅此答案:
- Spring 3.2 和 Jackson 2 自定义对象映射器 - Spring 3.2 and Jackson 2: add custom object mapper
- 使用 Sprint JavaCconfig 注册自定义 Jackson ObjectMapper - http://magicmonster.com/kb/prg/java/spring/webmvc/jackson_custom.html
- Restlet 复杂对象到 XML 序列化 - Restlet Complex Object to XML serializaton
希望对你有帮助, 蒂埃里