编码为深度嵌套对象的 HTML 字段 json
HTML fields json encoded as deep nested objects
我有一些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。我怎样才能让它工作?
编辑 25/03/2015:
我想解决我的问题的最简单方法是在提交时从javascript手动制作json,这并不能让我满意,因为很多逻辑都是客户端的,并且以这种方式公开我所有的DTO结构是可怕的。我不知道 Gson 中有任何自定义反序列化,我认为这是正确的路径。
任何其他帮助和不同的意见都很好接受。
您可能需要处理 JSON,直到它采用 Gson 可以识别的形式,即类似于以下内容的内容:
{
"defaultName": "Ford",
"carCategoryDTOs": [{
"defaultName": "cat1"
}],
"carTranslationsDTOs": [{
"name": "Ford",
"languageDTO": {
"code": "en"
}
}]
}
如果仍然遇到问题,可能需要编写自定义反序列化程序,请参阅 Gson 用户指南的编写反序列化程序部分。
请注意,您正在为carTranslationsDTOs
命名约定已关闭。由于它已经是一个has_many
关系,并且每个carTranslationsDTOs
实际上都是一个翻译,因此应该根据您的约定将其命名为carTranslationDTOs
。
JSON 不会映射到数据结构;以下是使用代码的 JSON 结果:
{
"defaultName":"default car name",
"carTranslationsDTOs[0][languageDTO][code]":"en",
"carTranslationsDTOs[0][name]":"car name in en",
"carCategoryDTOs[0][defaultName]":"cat1"
}
虽然GSON期望类似的东西
{
"defaultName":"default car name",
"carCategoryDTOs":[{"defaultName":"cat1"}],
"carTranslationsDTOs":[{"name":"car name in en",languageDTO:{"code":"en"}}],
}
我写了一个jQuery插件,它将平面和嵌套的html表单数据序列化/反序列化为JavaScript/json。我还没有在您的特定情况下尝试过,但据我所知,它可能会解决问题。
看看 https://github.com/omanshardt/jquery-uicForm3.git 就知道了。
- 处理HTML字段集's大小
- 编码为深度嵌套对象的 HTML 字段 json
- Javascript 单击html字段值而不编辑.js文件
- JavaScript 表单验证不适用于所有 HTML 字段
- JavaScript确认何时在表单中选择动态HTML字段
- 使用“添加用户”按钮添加HTML字段
- jquery动态添加HTML字段遇到了神秘的问题
- 如何显示和隐藏 html 字段集 以及从 Asp.Net 代码后面设置图例文本
- 在 HTML 字段中填写本地日期时间和时区名称
- 忽略链接、复选框.在可编辑的 HTML 字段中使用 jQuery
- 使用 JavaScript 进行 HTML 字段表单验证
- 如何使用 javascript 在新窗口中的 html 字段中显示值
- Javascript 为 HTML 字段赋值
- 所有 HTML 字段值的总和不起作用
- 显示 HTML 字段的 Android 软键盘,即使连接了输入设备
- javascript的新手,我将如何嵌入我的javascript文件并在HTML字段中运行它
- 为什么使用knockout.js时数据不会出现在HTML字段中
- 使用Javascript从html字段获取年龄
- 只允许HTML字段以某些单词开头
- 如何使用javascript填充HTML字段