2017-01-09 7 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

EDIT

Согласно THIS BENCHMARK с схемы JSON синтаксический немного быстрее работает и использовать много меньше память.

1

Похоже, что вы можете пропустить только один уровень вложенности объектов, используя root. "response.some.next.user" является допустимым ключом в формате JSON, поэтому он может быть использован в качестве root, в документе как

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

хотя это не то, что вы просите.

Есть некоторые примеры использования root среди стандартных спецификаций библиотеки Crystal, 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

 Смежные вопросы

  • Нет связанных вопросов^_^