我得到了回复,例如下一个表格:
var array=[];
var ref= firebase.database().ref().child('messages');
ref.orderByChild("fecha").on('value',function(snapshot){
snapshot.forEach(function(snap){
//test array
array[0] = snap.val().text;
console.log(array[0]);//show the data
});
});
//but out of the loop
console.log(array[0]);//Return undefined
我将resp = "{
\"response\":
{\"some\":
{\"next\":
{\"user\":
{\"name\":\"Oleg\"}
}
}
}
}"
用于来自JSON的组合用户
JSON.mapping
在这种情况下,当我有继承密钥时,如何使用struct User
JSON.mapping(
f_name: {type: String, key: "name", root: "WHAT.ABOUT.ROOT"}
)
end
属性?
root
我尝试了user = User.from_json(resp)
,但它不起作用
谢谢!
答案 0 :(得分:1)
您似乎只能使用root
跳过单个级别的对象嵌套。 "response.some.next.user"
是有效的JSON密钥,因此可以在{/ p>等文档中用作root
{ "response.some.next.user": { "name": "Oleg" } }
虽然这不是你要求的。
在Crystal标准库规范spec/std/json/mapping_spec.cr
中有一些使用root
的示例。
答案 1 :(得分:0)
我找到了解决方案:
require "json"
private struct Response
JSON.mapping(
result: {type: Result, key: "get_users_response"}
)
end
private struct Result
JSON.mapping(
client: {type: Client, key: "get_users_result"}
)
end
struct Client
JSON.mapping(
user: {type: User, key: "user"}
)
end
struct User
JSON.mapping(
id: {type: String, key: "id"},
f_name: {type: String, key: "first_name"},
l_name: {type: String, key: "last_name"}
)
end
resp = "{\"get_users_response\":{\"get_users_result\":{\"status\":\"Success\",\"error_code\":\"200\",\"user\":{\"id\":\"10\",\"first_name\":\"Oleg\",\"last_name\":\"Sobchuk\"}}}}"
response_container = Response.from_json(resp)
puts response_container
puts response_container.result.client.user
它看起来有点困难,但它有效https://play.crystal-lang.org/#/r/1k3a
修改强>
根据THIS BENCHMARK模式,JSON解析工作速度更快,使用的内存更少。