ActiveRecord: создание многострочного JSON, дружественного человеку - PullRequest
3 голосов
/ 10 июля 2011

Используя ActiveRecord :: Base.to_json, я делаю:

user = User.find_by_name 'Mika'

{"created_at":"2011-07-10T11:30:49+03:00","id":5,"is_deleted":null,"name":"Mika"}

Теперь, что я хотел бы получить:

{
    "created_at":"2011-07-10T11:30:49+03:00",
    "id":5,
    "is_deleted":null,
    "name":"Mika"
}

Есть ли возможность сделать это?

Было бы здорово иметь глобальную опцию, чтобы поведение было установлено в зависимости от среды разработки / реального времени.

Ответы [ 2 ]

5 голосов
/ 10 июля 2011

Я выйду на конечности и скажу "нет, такой возможности нет".

AFAIK, кодировка JSON фактически обрабатывается ActiveSupport, а не ActiveRecord. Если вы посмотрите на lib/active_support/json/encoding.rb для вашего драгоценного камня ActiveSupport, вы увидите, что происходит много обезьянок, добавляющих методы as_json и encode_json в некоторые основные классы; as_json методы просто используются, чтобы сгладить такие вещи, как Time, Regexp и т. д., для более простых типов, таких как String. Интересные патчи для обезьян - это encode_json, эти методы делают настоящую работу по созданию JSON, и в них нет ничего для контроля окончательного формата вывода; например, Hash-версия выглядит так:

# comments removed for clarity
def encode_json(encoder)
  "{#{map { |k,v| "#{encoder.encode(k.to_s)}:#{encoder.encode(v, false)}" } * ','}}"
end

encoder просто обрабатывает такие вещи, как Unicode и экранирование кавычек. Как видите, encode_json просто сводит все воедино в одну компактную строку без опций включения красивости.

Все сложные классы, по-видимому, сводятся к Hash или Array во время JSONification, поэтому теоретически вы можете добавить свои собственные патчи обезьяны в Hash и Array, чтобы они создавали что-то симпатичное. Однако у вас могут возникнуть проблемы с отслеживанием глубины структуры, которую вы так производите:

{
    "created_at":"2011-07-10T11:30:49+03:00",
    "id":5,
    "is_deleted":null,
    "name":"Mika"
    "nested":{
    "not":"so pretty now",
    "is":"it"
}
}

Было бы довольно прямо, но это:

{
    "created_at":"2011-07-10T11:30:49+03:00",
    "id":5,
    "is_deleted":null,
    "name":"Mika"
    "nested": {
        "not":"so pretty now",
        "is":"it"
    }
}

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

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

Если вы просто хотите отлаживать взаимодействия на основе JSON, то, возможно, расширение JSONovich для Firefox будет менее хлопотным. JSONovich имеет несколько приятных функций (таких как расширение и свертывание вложенных структур), которые выходят за рамки простой красивой печати. ​​


Кстати, я рассмотрел Rails 3.0 и 3.1 для этого, вы можете проверить Rails 2, если вам интересно.

1 голос
/ 03 ноября 2012

Рассматривали ли вы драгоценный камень JSON? Я считаю, что это именно то, что вы ищете.

, например

JSON.pretty_generate(user)

Посмотрите на детали здесь ...

http://apidock.com/ruby/JSON/pretty_generate

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