WedX - журнал о программировании и компьютерных науках

ActiveRecord: создание многострочного удобного для человека json

Используя 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"
}

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

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



Ответы:


1

Я рискну и скажу: «Нет, такого варианта нет».

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, если вам интересно.

10.07.2011
  • Спасибо, му, за подробный ответ. А пока я воспользуюсь простым выходом из установки надстройки в Firefox и воспользуюсь встроенной программой просмотра JSON Firebug для вызовов Ajax. На заметке; Я не использую Rails. Я создаю службы RESTful с Sinatra и ActiveRecord в качестве бэкэнда и ExtJs для внешнего интерфейса. Ваше здоровье! 11.07.2011

  • 2

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

    e.g.

    JSON.pretty_generate(user)
    

    Взгляните на детали здесь ...

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

    03.11.2012
  • Вау, это очень старый вопрос. И задача, и компания давно ушли :) Я попробовал ваше решение, которое дает хорошие результаты. Не уверен, насколько хорошо это впишется в патч обезьяны, выполненный ActiveRecord. Возможно, не подойдет, но жизнеспособно как индивидуальное решение. 20.11.2012
  • Новые материалы

    Объяснение документов 02: BERT
    BERT представил двухступенчатую структуру обучения: предварительное обучение и тонкая настройка. Во время предварительного обучения модель обучается на неразмеченных данных с помощью..

    Как проанализировать работу вашего классификатора?
    Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

    Работа с цепями Маркова, часть 4 (Машинное обучение)
    Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

    Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
    Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..

    Использование машинного обучения и Python для классификации 1000 сезонов новичков MLB Hitter
    Чему может научиться машина, глядя на сезоны новичков 1000 игроков MLB? Это то, что исследует это приложение. В этом процессе мы будем использовать неконтролируемое обучение, чтобы..

    Учебные заметки: создание моего первого пакета Node.js
    Это мои обучающие заметки, когда я научился создавать свой самый первый пакет Node.js, распространяемый через npm. Оглавление Глоссарий I. Новый пакет 1.1 советы по инициализации..

    Забудьте о Matplotlib: улучшите визуализацию данных с помощью умопомрачительных функций Seaborn!
    Примечание. Эта запись в блоге предполагает базовое знакомство с Python и концепциями анализа данных. Привет, энтузиасты данных! Добро пожаловать в мой блог, где я расскажу о невероятных..


    Для любых предложений по сайту: wedx@cp9.ru