我正在尝试自定义 JSON 文档的解析,以便我可以根据对象中的固定键设置用于文档中对象的类。
例如,任何出现在 JSON 中任何位置的对象,其键为“type”且值为“account”,都应创建Account
.
{"type": "account", "account_id": "1234"}
键为“type”且值为“user”的对象应创建User
.
{"type": "user", "username": "jane", "email": "jane@example.com"}
JSON 中的任何其他对象都应该正常解码,并且文档中的任何位置都可能嵌入了多个帐户/用户样式对象。
例如:
{
"version": "1.0",
"users": [{"type": "user", "username": "jane", "email": "jane@example.com"}],
"extra": {"paid": true, "account": {"type": "account", "account_id": "1234"}}
}
在 Python 中,我可以指定一个自定义解码器,允许我控制对象的实例化方式。
class CustomJSONDecoder(json.JSONDecoder):
def __init__(self, *args, **kwargs):
kwargs['object_hook'] = self.dict_to_object
super(CustomJSONDecoder, self).__init__(*args, **kwargs)
def dict_to_object(self, data):
identifier = data.get('type')
if identifier == 'account':
return Account(data)
elif identifier == 'user':
return User(data)
return data
def loads(content):
return json.loads(content, cls=CustomJSONDecoder)
同样在Javascript中我可以做到这一点......
function decoder(key, val) {
if (val._type === "account") {
return Account(val);
} else if (val._type === "user") {
return User(val);
}
return val;
}
function loads(content) {
return JSON.parse(content, decoder);
}
我不确定在 Ruby 中实现相同目标的最简单方法。
我已经看到它JSON.parse
需要一个object_class
参数,但这是一个固定的类,而不是动态确定的。
我真的不介意最终结果是通过对解析后的 JSON 进行后处理,还是在解析阶段发生。最简单的方法可能是正常解析 JSON,然后遍历并更改生成的数据结构,尽管如果是这种情况,我仍然会很感激有关实现它的一些指导。