首页 > 解决方案 > 处理可能更改的 json 响应(并非每次都包含所有键,可以添加新键)

问题描述

我在这里需要一些指示。

我正在与基于特定参数返回数据的 API 交谈。我一直在接受该响应并将其展平/编辑以适合我的模型,然后保存到数据库中。直到今天我开始测试实时端点(没有虚拟数据),一切都运行良好,事实证明,响应的格式发生了变化。

例如,如果数据集没有记录,而不是将值包含为 nil,则某些响应根本不包含该键。这打破了我展平和编辑的逻辑,因为现在我需要在做任何事情之前检查每个字段是否存在。

这是它的外观的 2 个片段

示例 1 -(不共享)

{
    "request_info": {
        "city_id": 76211,
        "currency": "usd",
        "req_type": "geom"
    },
    "data": {
        "rental_counts": {
            "counts": {
                "private": {
                    "1": 17,
                    "2": 3,
                    "all": 20
                },
                "entire": {
                    "0": 2,
                    "1": 8,
                    "2": 11,
                    "3": 16,
                    "4": 14,
                    "5": 6,
                    "all": 57
                }
            },
        }
    }
}

示例 2(包括共享)

{
    "request_info": {
        "city_id": 76211,
        "currency": "usd",
        "req_type": "geom"
    },
    "data": {
        "rental_counts": {
            "counts": {
                "private": {
                    "1": 17,
                    "2": 3,
                    "all": 20
                },
                "entire": {
                    "0": 2,
                    "1": 8,
                    "2": 11,
                    "3": 16,
                    "4": 14,
                    "5": 6,
                    "all": 57
                },
                "shared": {
                    "0": 2,
                    "1": 8,
                    "all": 10
                }
            },
        }
    }
}

我相信改变可以发生在任何级别和任何关键(父母或孩子)。我敢肯定我不是第一个遇到这种事情的人。管理它的最佳方法是什么?无论数据键是否存在,是否有一些方法或 gem 可以帮助解析 json 并将其转换为标准化模型?

我一直在看 Roar,但仍然不太明白它是如何运作的。这是 Roar 可以处理的事情,还是 json 对象需要预先定义而不是动态的?

标签: ruby-on-railsjsonjson-deserialization

解决方案


我找到了一个比咆哮或反序列化器更简单的解决方案。Ruby 的 slice 方法允许您只选择预定义的键并忽略所有其他键。我在展平哈希之后但在使用活动记录导入之前调用此方法。


推荐阅读