2017-01-09 37 views
1

我得到了例如一個表格迴應:JSON.mapping如果「根」屬性有繼承鍵

resp = "{ 
    \"response\": 
    {\"some\": 
     {\"next\": 
     {\"user\": 
      {\"name\":\"Oleg\"} 
     } 
     } 
    } 
}" 

我使用JSON.mapping從JSON

struct User 
    JSON.mapping(
    f_name: {type: String, key: "name", root: "WHAT.ABOUT.ROOT"} 
) 
end 

結合用戶怎麼用root屬性在這種情況下,當我有繼承鍵?

user = User.from_json(resp) 

我試圖root: "response.some.next.user",但它不工作

謝謝!

回答

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解析工作快一點,並使用多內存較少。

1

看起來您只能跳過使用root的單個對象嵌套級別。 "response.some.next.user"是一個有效的JSON關鍵,因此它可以作爲root,文檔中像

{ "response.some.next.user": { "name": "Oleg" } } 

雖然這不是你所要求的。

在Crystal標準庫規範中使用root的例子有spec/std/json/mapping_spec.cr

+0

不幸的是它不起作用[https://play.crystal-lang.org/#/r/1jzt](https://play.crystal-lang.org/#/r/1jzt)。也許我做錯了什麼?但似乎''root'鍵'one.two.three'不起作用。 –

+0

'「get_user.get_user_result.user」'不是該文檔中的關鍵。 – bjmllr