какова хэш-структура для создания json?

Ниже приведен пример финального json, который я передаю в javascript. Я буду использовать библиотеку ruby ​​(yajl), чтобы создать этот json из хеша.

Вопрос в том, как должен выглядеть рубиновый хеш, который создает приведенный ниже json?

var data = [{
       data: "basics",
       attr: {},
        children: [
         {data: "login", attr: {run: "run"},
           children: [                   
           {data: "login", attr: {}}
          ]
         } ,
         {data: "Academic Year", attr: {run: "run"},
          children: [                   
           {data: "login", attr: {}},
           {data: "Academic Year", attr: {filter: "mini", SOF: "yes"}}
          ]

         }
        ]
      }];

person Radek    schedule 28.04.2011    source источник
comment
@Phrogz: @Larry уже указал на это. Я не знал об этом. Спасибо вам, ребята.   -  person Radek    schedule 28.04.2011


Ответы (4)


Ваш вопрос не слишком ясен. Вы имеете в виду, какая структура Ruby создаст JSON, который вы показываете в своем вопросе?

Если это так, то вот вам.... Обратите внимание, что структура базового уровня представляет собой массив Ruby, потому что ваша структура базового уровня JSON также является массивом.

mydata = [{
           'data' => "basics",
           'attr' => {},
           'children' => [{
                          'data' => "login",
                          'attr' => {'run' => "run"},
                          'children' => [{
                                         'data' => "login",
                                         'attr' => {}
                                        }]
                          },
                          {
                           'data' => "Academic Year",
                           'attr' => {'run' => "run"},
                           'children' => [{
                                          'data' => "login",
                                          'attr' => {}
                                          },
                                          {
                                           'data' => "Academic Year",
                                           'attr' => {'filter' => "mini", 
                                                      'SOF' => "yes"}
                                          }]
                           }]
         }]
person Larry K    schedule 28.04.2011

  1. Скопируйте свой код (точно) после var и перед ;
  2. Вставить в Ruby (1.9+)
    На этом все готово. Чтобы доказать это...
  3. require "json"
  4. puts data.to_json

Результат (с дополнительными разрывами строк):

#=> [{"data":"basics","attr":{}, "children":[
#=>    {"data":"login","attr":{"run":"run"},"children":[
#=>      {"data":"login","attr":{}}
#=>    ]},
#=>    {"data":"Academic Year","attr":{"run":"run"},"children":[
#=>      {"data":"login","attr":{}},
#=>      {"data":"Academic Year","attr":{"filter":"mini","SOF":"yes"}}
#=>    ]}
#=> ]}]
person Phrogz    schedule 28.04.2011
comment
+1 Это почти то, что я делаю каждый раз, когда мне нужна версия структуры данных JSON или YAML, а не пытаюсь сгенерировать ее вручную. - person the Tin Man; 28.04.2011
comment
когда я копирую точный код, я получаю «список нечетных чисел для хэша». Использование ruby ​​​​1.8.7 (уровень исправления 302 16 августа 2010 г.) [i386-mingw32] - person Radek; 04.05.2011
comment
@Radek В Ruby 1.8.7 вам нужно будет изменить исходный код Ruby, чтобы все экземпляры foo: ... вместо этого отображали :foo => .... Буквенное обозначение хэша foo: bar — это сокращение, доступное только в Ruby 1.9+. - person Phrogz; 04.05.2011
comment
Кроме того, Радек, это не ошибка, которую вы получите, если скопируете/вставите именно свой код в 1.8.7, что означает, что вы делаете что-то отличное от того, что я предложил. Вероятно, вам следует создать новый вопрос или pastie своего кода. - person Phrogz; 04.05.2011

Вы можете легко выяснить, какая структура данных будет создавать этот JSON самостоятельно:

require 'active_support'
json = '[{
       data: "basics",
       attr: {},
        children: [
         {data: "login", attr: {run: "run"},
           children: [
           {data: "login", attr: {}}
          ]
         } ,
         {data: "Academic Year", attr: {run: "run"},
          children: [
           {data: "login", attr: {}},
           {data: "Academic Year", attr: {filter: "mini", SOF: "yes"}}
          ]

         }
        ]
      }]'
puts ActiveSupport::JSON.decode(json).inspect

А затем быстрое переформатирование вывода дает вам следующее:

[
    {
        "data" => "basics",
        "children" => [
            {
                "data" => "login", 
                "children" => [
                    {
                        "data" => "login", 
                        "attr" => { }
                    }
                ], 
                "attr" => {
                    "run" => "run"
                }
            }, 
            {
                "data" => "Academic Year", 
                "children" => [
                    {
                        "data" => "login", 
                        "attr" => { }
                    }, 
                    {
                        "data" => "Academic Year", 
                        "attr" => {
                            "filter" => "mini", 
                            "SOF" => "yes"
                        }
                    }
                ], 
                "attr" => {
                    "run" => "run"
                }
            }
        ], 
        "attr" => { }  
    } 
]

Вероятно, есть более простые способы, но описанное выше подойдет для быстрого одноразового взлома.

person mu is too short    schedule 28.04.2011
comment
не могли бы вы рассказать о более простых способах :-) Я создам хэш на лету на основе структуры каталогов файлов и содержимого этих файлов. Я не знал, как структурировать этот хеш.. но если есть что-то проще... :-) - person Radek; 28.04.2011
comment
Мне гораздо проще использовать обычный модуль JSON вместо загрузки в Active_Support. - person the Tin Man; 28.04.2011
comment
@ The Tin Man: Я только что использовал Rails, потому что в последнее время много работал с Rails и JSON. @Radek: я сказал, вероятно :) Похоже, у Phrogz есть что-то, что делает вывод более читаемым без ручного форматирования. - person mu is too short; 28.04.2011

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

person eggie5    schedule 28.04.2011
comment
мой вопрос: как должен выглядеть хэш, который можно преобразовать в указанный выше json - person Radek; 28.04.2011
comment
Проголосовали против не только потому, что это пропустило вопрос, но и потому, что, хотя это допустимый литерал JS, он недействителен JSON. - person Phrogz; 28.04.2011
comment
@Phrogz: не могли бы вы объяснить мне это? is a valid JS literal, it is not valid JSON - person Radek; 28.04.2011
comment
@Radek Литерал объекта с литералом регулярного выражения — { foo:/bar/ } — допустим JS, но недействителен JSON: JSON не поддерживает обычные выражения. Точно так же большая часть допустимого кода JS не является допустимым JSON. В этом случае JS позволяет использовать действительные идентификаторы непосредственно в качестве атрибутов литералов объектов — { foo:42 } — но JSON требует, чтобы они были заключены в двойные кавычки, то есть { "foo":42 }. - person Phrogz; 28.04.2011