Java HTML字段json编码为深嵌套对象

Java HTML字段json编码为深嵌套对象,java,javascript,html,json,gson,Java,Javascript,Html,Json,Gson,我有一些JavaRESTWS处理来自简单HTML表单的POST数据。 我想让客户端代码向ws发送正确的JSON,使服务器代码以正确的方式填充我的对象 我有以下数据结构: public class CarDTO { String id; String defaultName; List<CarCategoryDTO> carCategoryDTOs; List<CarTranslationsDTO> carTranslationsDTOs;

我有一些JavaRESTWS处理来自简单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*/
}
客户端代码:

<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(“提交按钮”)。单击(函数(){
var formData=JSON.stringify(jQuery(“#form_car”).serializeObject();
jQuery.ajax({
url:“http://www.someurl.com:8080/rest/0.1/car/save",
类型:“POST”,
数据:formData,
contentType:“应用程序/json;字符集=utf-8”,
数据类型:“json”,
成功:功能(数据){
控制台日志(数据);
}
});
});
我还添加了以下jQuery扩展,但这还不够:

问题是参数集合的映射,结果是我只能填充CarDTO.id和CarDTO.defaultName。 我怎样才能让它工作

编辑2015年3月25日:

我发现解决我的问题最简单的方法是在提交时从javascript手动生成json,这并不能让我满意,因为很多逻辑都是客户端的,以这种方式公开我的所有DTO结构非常糟糕。 我不知道Gson中有任何自定义反序列化,我认为这是正确的路径


任何其他帮助和不同的意见都会被广泛接受。

您可能需要处理JSON,直到它以Gson可以识别的形式出现,即大致如下:

{
“defaultName”:“Ford”,
“Carcategoridtos”:[{
“defaultName”:“cat1”
}],
“CartTranslationsDTOS”:[{
“名称”:“福特”,
“languageDTO”:{
“代码”:“en”
}
}]
}
如果仍然遇到问题,可能需要编写自定义反序列化程序,请参阅《Gson用户指南》的一节


请注意,
cartranslationsdto
的命名约定处于禁用状态。由于它已经是一个有很多关系的
,而且每个
cartranslationdto
实际上都是一个翻译,根据您的惯例,它应该被命名为
carTranslationDTOs

您的JSON没有映射到您的数据结构;以下是使用您的代码生成的JSON结果:

{
 "defaultName":"default car name",
 "carTranslationsDTOs[0][languageDTO][code]":"en",
 "carTranslationsDTOs[0][name]":"car name in en",
 "carCategoryDTOs[0][defaultName]":"cat1"
}
而格森期望的是

{
 "defaultName":"default car name",
 "carCategoryDTOs":[{"defaultName":"cat1"}],
 "carTranslationsDTOs":[{"name":"car name in en",languageDTO:{"code":"en"}}],
}

我编写了一个jQuery插件,它将平面和嵌套的html表单数据序列化/反序列化到javascript/json中。我还没有试过你的特殊情况,但据我所知,这可能会解决问题


看看。

你能提供formdata吗?它已经存在了,HTML+Javascript我说的是stringify语句的输出。这样就可以将它与类映射联系起来。您有很多库可以按照您想要的方式将表单序列化为JSON,请看一下,等等。。
{
 "defaultName":"default car name",
 "carCategoryDTOs":[{"defaultName":"cat1"}],
 "carTranslationsDTOs":[{"name":"car name in en",languageDTO:{"code":"en"}}],
}