LINUX.ORG.RU

XML -> JSON

 ,


0

1

Есть задача придумать человекоредактируемый формат сериализации простенькой древовидной структуры. Каждый элемент структуры является либо контейнером, либо конечным элементом (листом). Контейнер может содержать произвольное количество элементов (как контейнеров, так и листов). При этом, у контейнеров и листов есть метаданные, достаточно сложные.

На XML такая задача решается элементарно, например как-то так:

<root>
  <container title="foo">
    <container title="baz">
      <element title="e1" />
      <element title="e2" />
    </container>
    <element title="e3" />
  </container>
</root>

Но есть определенные причины хотеть не XML, а JSON. А как сконвертировать подобное дерево в JSON? Я вот предпринял две попытки и получилась громоздкая хрень:

{
    "root": [
        {
            "type": "container",
            "title": "foo",
            "elements": [
                {
                    "type": "container",
                    "title": "baz",
                    "elements": [
                        {
                            "type": "element",
                            "title": "e1"
                        },
                        {
                            "type": "element",
                            "title": "e2"
                        }
                    ]
                },
                {
                    "type": "element",
                    "title": "e3"
                }
            ]
        }
    ]
}
{
    "root": [
        {
            "container": {
                "title": "foo",
                "elements": [
                    {
                        "container": {
                            "title": "baz",
                            "elements": [
                                {
                                    "element": {
                                        "title": "e1"
                                    }
                                },
                                {
                                    "element": {
                                        "title": "e2"
                                    }
                                }
                            ]
                        }
                    },
                    {
                        "element": {
                            "title": "e3"
                        }
                    }
                ]
            }
        }
    ]
}

Обилие скобочек явно не способствует человекоредактируемости. Есть идеи как-то улучшить JSONовский формат?

★★★★★

Ответ на: комментарий от Deleted

Ямль не рассматриваю из-за отступов. Один из вариантов редактирования документа - через вебформу, там с отступами будет тяжелее чем со скобочками.

provaton ★★★★★
() автор топика

А зачем на JSON переписывать структуру зумля ?

robot12 ★★★★★
()
{
  "root": {
    "container": {
      "-title": "foo",
      "container": {
        "-title": "baz",
        "element": [
          { "-title": "e1" },
          { "-title": "e2" }
        ]
      },
      "element": { "-title": "e3" }
    }
  }
}
robot12 ★★★★★
()

плаинтекст

root.container.title foo
root.container.container.title baz
root.container.container.element.title e1
root.container.container.element.title e2
root.container.element.title e3

при желании - приделать какое-нибудь левелирование и прочие хитрости для упрощения

feofil
()
Ответ на: комментарий от robot12

В твоем примере структуры как бы нет вообще. Например, добавить в контейнер foo еще один контейнер нельзя будет, так как проперти по имени container уже занято контейнером baz.

provaton ★★★★★
() автор топика
Ответ на: комментарий от feofil

Вариант. Но много повторений будет, в реальной задаче метаданных штук по 6-8 на каждый лист, и 2-3 на контейнер.

provaton ★★★★★
() автор топика
Ответ на: комментарий от provaton

я же говорю, сделать разные . или .. для повторений и отмотки

feofil
()

В XML атрибуты гармонично вписываются, в остальные форматы не очень. Если от них отказаться, то получается вполне куда ни шло. Строго говоря - нет взаимно-однозначного соответствия. Имеет место согласительные меры. Возможны разные варианты решений. Например в JSON выделять для атрибутов специальную секцию: (_attr_foo | _attr_bar | node_attrs ...)

Дополнительно тут про атрибуты:

http://www.w3schools.com/xml/xml_attributes.asp

http://stackoverflow.com/questions/4056419/json-corresponding-to-an-xml-with-...

swwwfactory ★★
()

Но есть определенные причины хотеть не XML, а JSON

редактировать xml, а потом преобразовывать в json (javascriptoм или ещё как). человекоредактируемость для таких структур фактически синоним xml, любая замена будет сильно проигрывать.

vtVitus ★★★★★
()
Последнее исправление: vtVitus (всего исправлений: 1)

S-expressions

anonymous
()
Ответ на: комментарий от swwwfactory

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

<root>
  <container>
    <title>foo</title>
    <container>
      <title>baz</title>
      <element>
        <title>e1</title>
      </element>
      <element>
        <title>e2</title>
      </element>
    </container>
    <element>
      <title>e3</title>
    </element>
  </container>
</root>

provaton ★★★★★
() автор топика
Последнее исправление: provaton (всего исправлений: 2)
Ответ на: комментарий от lovesan

Оно конечно прикольно, но боюсь что юзера напугаются. Надо что-то ходовое и привычное для всех, собственно поэтому и json хочется. json и javascript сейчас знают практически все, лингва франка в КС.

provaton ★★★★★
() автор топика
[{title: 'foo'},
    [{title: 'baz'},
        {title: 'e1'},
        {title: 'e2'}
    ],
    {title: 'e3'}
]
baverman ★★★
()

Может придумать человекоудобный редактор для XML или JSON ?

ilovewindows ★★★★★
()

если контейнеры не имеют свойств, то

{
  "foo": [
    "baz": [
      "e1": {},
      "e2": {},
    ],
    "e3": {}
  ]
}

если имеют, то

{
  "foo": {
    "prop1": "x",
    "prop2": "y",
    "content": [
      "baz": {
        "prop3": "z",
        "content": [
          "e1": {},
          "e2": {},
        ],
      }
      "e3": {}
    ]
  }
}

marvin_yorke ★★★
()
Последнее исправление: marvin_yorke (всего исправлений: 1)

а вообще

человекоредактируемый формат

и

метаданные, достаточно сложные

плохо совмещаются как в том, так и в другом варианте

marvin_yorke ★★★
()
Последнее исправление: marvin_yorke (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.