Вывод JSON RABL не соответствует стандарту? Может это?

Итак, у меня есть очень простое представление rabl, которое будет поддерживать вывод для xml и json (curr.rabl):

collection @currencies => "currencies"

attributes :code, :name

Мой конфиг рабл:

Rabl.configure do |config|
    config.include_json_root = false
    config.include_child_root = false
    config.xml_options = { :skip_types => true, :camelize => :lower }
    config.include_xml_root = false
end

Вывод, который Rabl дает для XML и JSON:

XML:

<currencies>
<currency>
<code>AFN</code>
<name>Afghan Afghani</name>
</currency>
<currency>
<code>AFA</code>
<name>Afghanistan Afghani</name>
</currency>
</currencies>

JSON:

{
currencies: [
{
code: "AFN",
name: "Afghan Afghani"
},
{
code: "AFA",
name: "Afghanistan Afghani"
}]}

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

{
currencies: {currency: [
{
code: "AFN",
name: "Afghan Afghani"
},
{
code: "AFA",
name: "Afghanistan Afghani"
} ] }
}

Если я установлю config.include_child_root(/include_json_root) = trueтогда я получаю следующее (все еще не правильно)

{
currencies: [
{
currency: {
code: "AFN",
name: "Afghan Afghani"
}
},
{
currency: {
code: "AFA",
name: "Afghanistan Afghani"
} } ] }

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

2 ответа

Просто чтобы прояснить это определенно не стандартно:

{
currencies: {currency: [
{
code: "AFN",
name: "Afghan Afghani"
},
{
code: "AFA",
name: "Afghanistan Afghani"
} ] }
}

Обе формы, которые производит RABL, являются стандартными. Один без рута и один с. Это не имеет смысла, я никогда не видел, чтобы API действовал таким образом.

Я всегда использовал вторую форму того, что у вас есть выше:

{
   currencies: [
   {
      currency: {  ... },
   },
   { 
      currency: { ... }
   }]
}

Если вы действительно хотите сделать это:

{
   currencies: { currency: [ { ... }, { ... }] }
}

Я думаю, что вы можете установить для include_json_root значение false и использовать пользовательские узлы, но это может оказаться сложным.

Другие вопросы по тегам