我有一些 Java REST ws 处理来自简单 HTML 表单的 POST 数据。 我想让客户端代码向 ws 发送正确的 JSON,以使服务器代码以正确的方式填充我的对象。
我有以下数据结构:
public class CarDTO
{
String id;
String defaultName;
List<CarCategoryDTO> carCategoryDTOs;
List<CarTranslationsDTO> carTranslationsDTOs;
/* getter, setter, constructors*/
}
public class CarCategoryDTO
{
String id;
String defaultName;
/* getter, setter, constructors*/
}
public class CarTranslationsDTO
{
int id;
String name;
LanguageDTO languageDTO;
/* getter, setter, constructors*/
}
public class LanguageDTO
{
String code;
/* getter, setter, constructors*/
}
发布操作:
@POST
@Path("/save")
public Response saveCar(String args)
{
try
{
Gson g = new GsonBuilder().create();
CarDTO carDTO = g.fromJson(args, CarDTO.class);
System.out.println(carDTO);
return Response.ok(g.toJson(carDTO)).build();
} catch (Exception e) {
e.printStackTrace();
return Response.serverError().build();
}
}
客户端代码:
<form id="form_car"
enctype="application/json"
action="http://www.someurl.com:8080/rest/0.1/car/save"
method="POST">
<input type="text" name="defaultName" />
<input type="hidden" name="carTranslationsDTOs[0][languageDTO][code]" value='en'>
<input type="text" name="carTranslationsDTOs[0][name]">
<input type="text" name="carCategoryDTOs[0][defaultName]" value="cat1">
<input id="submitbutton" type="button" value="Salva"/>
</form>
<script>
jQuery("#submitbutton").click(function(){
var formData = JSON.stringify(jQuery("#form_car").serializeObject());
jQuery.ajax({
url: "http://www.someurl.com:8080/rest/0.1/car/save",
type:"POST",
data:formData,
contentType:"application/json; charset=utf-8",
dataType:"json",
success: function(data){
console.log(data);
}
});
});
</script>
我还添加了以下 jQuery 扩展,但这还不够:jquery.serializeObject.js
问题是与参数集合的映射,结果是我只能填充 CarDTO.id 和 CarDTO.defaultName。 我怎样才能让它发挥作用?
编辑 2015 年 3 月 25 日:
我发现解决问题的最简单方法是在提交时从 javascript 手动生成 json,但这并不能让我满意,因为很多逻辑都是客户端的,并且以这种方式公开我的所有 DTO 结构非常糟糕。 我不知道 Gson 中有任何自定义反序列化,我认为这是正确的道路。
任何其他帮助和不同意见都会被接受。
最佳答案
您可能需要处理 JSON,直到它成为 Gson 可以识别的形式,即类似于以下内容的内容:
{
"defaultName": "Ford",
"carCategoryDTOs": [{
"defaultName": "cat1"
}],
"carTranslationsDTOs": [{
"name": "Ford",
"languageDTO": {
"code": "en"
}
}]
}
如果您仍然遇到问题,您可能需要编写自定义反序列化器,请参阅Writing a Deserializer Gson 用户指南部分。
请注意,您的 carTranslationsDTO
的命名约定已关闭。由于它已经是一个 has_many
关系,并且每个 carTranslationsDTOs
实际上是一个翻译,因此根据您的约定,应将其命名为 carTranslationDTOs
。
关于java - HTML 字段 json 编码为深层嵌套对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29061488/