【问题标题】:How to model a JSON with pair meta/result如何使用对元/结果对 JSON 建模
【发布时间】:2013-12-08 02:53:22
【问题描述】:

我正在为我没有源代码访问权限的 REST 服务实现多个 REST 客户端包装器(Java、C#、Objective-C 和 Python)。在所有这些中,我都遇到了建模问题,所以你当然可以假设我的缺陷在于 OOP,而不是语言语法或其他东西。我想知道也许有人可以帮助我修复这个缺陷或找出 REST 服务是否是问题所在,希望这个主题可以帮助其他人改进他们的 OOP 建模。

WebService 将始终返回具有以下结构的 JSON:

{
    "meta": {
        "code": 200,
        "message": "OK"
    },
    "result": [
        {
             ...
        },
        {
             ...
        },
        ...
        ]
    }
}

问题是:“元”将始终具有相同的模型,“结果”将始终是对象列表,但这些对象会根据我们访问的端点而改变。所以我有多个类,每个类对应一个端点,结果总是最终成为这些类之一的列表。所以我想了多种解决方法,但没有一个是我真正喜欢的。除了以下方法还有其他选择吗?谢谢。

方法一

带有代码和消息字段的元类,带有元字段和结果字段为 JSONData 的 ServiceResponse 类

每个特定的类都有一个以 JSONData 作为参数的构造函数,在创建时解析。

问题

JSONData没有被封装,因为它必须一直被处理,并且由于多次解析相同的JSONData,性能很差,因为ServiceResponse不保存解析的对象。

方法二

为我拥有的每个不同的班级制作一个 ModelResponse。例如。 ProductsResponse 带有元和产品列表,VenuesResponse 带有元和产品列表等。

问题

代码重用差。

【问题讨论】:

    标签: json oop modeling


    【解决方案1】:

    好的,在解释了这里的问题并思考了几个小时,制作 PoC 等等之后,我得出了我认为是一个很好的高效建模。

    我基本上选择了方法 2 并通过执行以下操作修复了“代码重用差”的问题。我将使用一种尽可能通用的伪语言,以便任何有面向对象编程知识的人都能理解:

    abstract class ServiceResponse:
        int code
        string message
        JsonReader _reader
        void parseMeta():
            _reader.beginObject()
            ...
            _reader.endObject()
    
        abstract void parseResult() // will be implemented by child classes
    
        public ServiceResponse(JsonReader reader):
            _reader = reader
            _reader.beginObject()
            ...
                 parseMeta()
            ...
                 parseResult()
            ...
            _reader.endObject()
    

    然后对于每一种响应我创建一个继承自ServiceResponse的类,例如:

    class ProductsResponse extends ServiceResponse:
         List<Products> products
         public ProductsResponse(JsonReader reader):
             parent(reader)
         override void parseResult():
             _reader.beginArray();
             ...
             _reader.endArray();
    

    然后我有一个 ServiceEndpoints 类,它对每个端点都有一个方法。通过 WS 文档,我知道哪个端点会返回哪种类型的响应,因此我可以实例化正确的类(ProductsResponse、VenuesResponse 等)并返回正确的列表类型。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-15
      • 2017-07-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多