改造 JSON 反序列化对象的 $ref 对其原始副本的引用

Posted

技术标签:

【中文标题】改造 JSON 反序列化对象的 $ref 对其原始副本的引用【英文标题】:Retrofit JSON deserializing object's $ref reference to its original copy 【发布时间】:2016-06-16 17:42:51 【问题描述】:

我将 Microsoft.Net 与 Breeze 一起用于 API,使用 Retrofit 获得的结果嵌套了重复的相同对象。例如 EmployeeJob 具有 Customer 导航属性,因此 API 结果如下所示

 
   Id:1,
   "Customer_Id": 39,
    "Customer": 
        "$id": "2",
        "$type": "Wit.Trade.Entities.Customer, Wit.Trade",
        "CourtesyTitle": "Mr",
        "FirstName": "Ahmad"
    


  Id:2
  "Customer_Id": 39,
    "Customer": 
        "$ref": "2" //here same customer Ahmad
    ,

现在我得到的这些EmployeeJobs 中的Java List 在第一条记录中只有Customer,而其他的则什么都没有。如何将 $ref:"2" 映射到其原始值而不是 $ref

出于网络和性能原因,我不希望我的服务器 API 发送完整的对象,这就是为什么我想在客户端反序列化这些 $refs,就像 Angularjs $resource service 为我们所做的那样。

【问题讨论】:

你有没有偶然找到这个问题的答案? 我正在为您手动发布答案。 【参考方案1】:

目前我已经为这样的 $ref 解决方案手动工作了

//========== $ref manual solution for employee jobs' customers
            List<Customer> completedCustomers = new ArrayList<>();
            for (EmployeeJob empJob : empJobs) 
                if (empJob.Customer != null && empJob.Customer.Id == null && empJob .Customer.$ref != null) 
                    for (Customer comCus : completedCustomers) 
                        if (comCus.$id.equalsIgnoreCase(empJob.Customer.$ref))
                            empJob.Customer = comCus;
                    
                 else
                    completedCustomers.add(empJob.Customer);
            

现在empJobs 已将 $refs 替换为相应的客户。

【讨论】:

Jesse Wilson 对您在github.com/square/moshi/issues/146 上的问题的反应是建议为 Gson 编写像 GraphAdapterBuilder 这样的适配器。你没做到吗?我无法确认这是否像他所说的那样“直截了当”。我只是部分理解,这还不够。

以上是关于改造 JSON 反序列化对象的 $ref 对其原始副本的引用的主要内容,如果未能解决你的问题,请参考以下文章

如何让 System.Text.Json 将对象反序列化为其原始类型?

如何使用 Jackson 将原始 JSON 反序列化为 Java 对象

如何解决fastjson把对象转化成json避免$ref

json 从遗留属性名称反序列化

Kotlin Model类在Json反序列化过程为空性探索

从api逻辑任务和反序列化对象并反序列化json