【问题标题】:HTML fields json encoded as deep nested objectsHTML 字段 json 编码为深层嵌套对象
【发布时间】:2015-03-15 14:02:57
【问题描述】:

我有一些 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 动作:

@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 中有任何自定义反序列化,我认为这是正确的路径。

任何其他帮助和不同意见都可以接受。

【问题讨论】:

标签: java javascript html json gson


【解决方案1】:

您可能需要处理 JSON,直到它采用 Gson 可以识别的形式,即类似于以下内容:

{
  "defaultName": "Ford",
  "carCategoryDTOs": [{
    "defaultName": "cat1"
  }],
  "carTranslationsDTOs": [{
    "name": "Ford",
    "languageDTO": {
      "code": "en"
    }
  }]
}

如果您仍然遇到问题,您可能需要编写自定义反序列化器,请参阅 Gson 用户指南的 Writing a Deserializer 部分。

请注意,您的 carTranslationsDTOs 的命名约定已关闭。由于它已经是has_many 关系,并且每个carTranslationsDTOs 实际上是一个单独的翻译,因此根据您的约定应该将其命名为carTranslationDTOs

【讨论】:

    【解决方案2】:

    您的 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"}}],
    }
    

    【讨论】:

      【解决方案3】:

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

      看看https://github.com/omanshardt/jquery-uicForm3.git

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-08-18
        • 1970-01-01
        • 2022-11-04
        • 1970-01-01
        • 1970-01-01
        • 2015-07-19
        相关资源
        最近更新 更多