如果“root”属性具有继承密钥,则为JSON.mapping

时间:2017-01-09 13:26:42

标签: crystal-lang

我得到了回复,例如下一个表格:

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) ,但它不起作用

谢谢!

2 个答案:

答案 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解析工作速度更快,使用的内存更少。