Извлечение объектов JSON из строки JSON - PullRequest
2 голосов
/ 10 августа 2011

Я хочу разбить строку JSON на меньшие объекты.У меня есть два сервера, один из которых служит интерфейсом веб-приложения для всего приложения, а другой - хранилище / база данных.

Я могу получать информацию из хранилища в веб-приложение как JSON,но после этого я не знаю, как его вернуть.

Вот пример возвращаемого JSON:

{"respPages":[{"page":{"page_url":"http://www.google.com/","created_at":"2011-08-10T11:00:19Z","website_id":1,"updated_at":"2011-08-10T11:00:19Z","id":1}},{"page":{"page_url":"http://www.blank.com/services/content_services/","created_at":"2011-08-10T11:02:46Z","website_id":1,"updated_at":"2011-08-10T11:02:46Z","id":2}}],"respSite":{"website":{"created_at":"2011-08-10T11:00:19Z","website_id":null,"updated_at":"2011-08-10T11:00:19Z","website_url":null,"id":1}},"respElementTypes":[{"element_type":{"created_at":"2011-08-10T11:00:19Z","updated_at":"2011-08-10T11:00:19Z","id":1,"tag_name":"head"}},

В JSON есть четыре тега:

page
website
elementType
elementData

Я хотел бы создать четыре массива и заполнитьих с объектом, который соответствует этим тегам.

Я бы изобразил, что код выглядит примерно так:

#Get the json from repo using net/http
 uri = URI.parse("http://127.0.0.1:3007/repository/infoid/1.json")
 http = Net::HTTP.new(uri.host, uri.port)
 response = http.request(Net::HTTP::Get.new(uri.request_uri))


@x = response.to_hash

@pages = Array.new
@websites= Array.new
@elementDatas = Array.new
@elementTypes = Array.new

#enter code here`#For every bit of the hash, find out what it is and allocate it accordingly
    @x.each_with_index do |e,index|
    if e.tagName == pages #Getting real javascripty here. There must be someway to check the tag or title of the element
    @pages[index]=e
    end

Моя цель для возвращаемого значения состоит в том, чтобы иметь четыре массива, каждый из которых содержит разные типыобъектов:

  @pagesArray[1]

должен содержать первое вхождение объекта страницы в строке JSON.Затем сделайте то же самое с остальными.

Конечно, мне нужно разбить объект дальше, но как только я смогу разбить верхний уровень и классифицировать их, я смогу пойти глубже.

В JSON уже есть заголовки тегов respPages и respWebsites, которые группируют все объекты.

Как превратить JSON обратно в объекты в Ruby и ссылаться на них, используя что-то вроде имени тега?

Ответы [ 2 ]

3 голосов
/ 10 августа 2011

Вы должны иметь возможность декодировать что-либо в формате JSON, используя стандартную библиотеку JSON:

JSON.load(...)

Это вызовет исключения для искаженных данных JSON, поэтому обязательно тщательно протестируйте их и убедитесь, что они могут обрабатыватьвсе важные случаи.

Если вы пытаетесь ориентироваться в структуре самого JSON, вам, вероятно, нужно написать серию рекурсивных методов, которые будут обрабатывать каждый случай по пути.Хороший шаблон, с которого можно начать, это:

@data.each do |key, value|
  case (key)
  when 'someKey'
    handle_some_key(value)
  when 'otherKey'
    handle_other_key(value)
  end
end

Вы можете разбить поведение на методы, как в этом примере, или встроить его, если логика довольно проста.

КакОбратите внимание, что альтернативой Array.new является просто [ ], как и в JavaScript.Например:

@pages = [ ]

Вы увидите, что это часто используется в большинстве примеров Ruby.Альтернативой Hash.new является { }.

0 голосов
/ 10 августа 2011

Следующие работы:

json = {"respPages"=>[{"page"=>{"page_url"=>"http://www.google.com", "created_at"=>"2011-08-10T11:00:19Z", "website_id"=>1, "updated_at"=>"2011-08-10T11:00:19Z", "id"=>1}}, {"page"=>{"page_url"=>"http://www.blank.com/services/content_services/", "created_at"=>"2011-08-10T11:02:46Z", "website_id"=>1, "updated_at"=>"2011-08-10T11:02:46Z", "id"=>2}}], 
        "respSite"=>{"website"=>{"created_at"=>"2011-08-10T11:00:19Z", "website_id"=>nil, "updated_at"=>"2011-08-10T11:00:19Z", "website_url"=>nil, "id"=>1}}, 
        "respElementTypes"=>[{"element_type"=>{"created_at"=>"2011-08-10T11:00:19Z", "updated_at"=>"2011-08-10T11:00:19Z", "id"=>1, "tag_name"=>"head"}}]}

@respPages, @respSite, @respElementTypes = [], [], []

json.each do |key_category, group_category|
  group_category.each do |hash|
    if group_category.is_a? Array
      eval("@#{key_category}") << hash.values.first
    elsif group_category.is_a? Hash
      eval("@#{key_category}") << hash[1]
    end
  end
end

В вашем образце не было respData, но у вас есть идея.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...