Java преобразует XML в JSON и определяет, является ли массив или объект

Мне нужно преобразовать XML в JSON, и у меня есть следующий код, который отлично работает. Проблема, однако, возникает, когда XML-элемент действительно должен быть преобразован в массив. Мой вопрос состоит из двух частей:

1) Как правильно представить массив в xml?

Вот xml, который я сейчас использую. Содержимое элементов на самом деле должно быть массивом. Таким образом, elements[0] должен быть элементом внутри.

<project id="200">
    <name>test</name>
    <elements>
        <element>
            <id>body</id>
            <width>200</width>
            <height>400</height>
            <children/>
        </element>
    </elements>
</project>

2) Как я могу преобразовать xml в JSON, содержащий массивы JSON, а также объекты?

private String xmlToJson(String xml) throws IOException {

    JSONObject jsonObject = XML.toJSONObject(xml);

    return jsonObject.toString(4);

} // End of XML to JSON

Большое спасибо


person Tom Hadkiss    schedule 25.02.2014    source источник
comment
Просмотрите предыдущие ответы на SO stackoverflow.com/a/1823328/1759128.   -  person ItachiUchiha    schedule 25.02.2014
comment
к сожалению, это решение не отвечает на мой вопрос, поскольку оно не выделяет массивы   -  person Tom Hadkiss    schedule 25.02.2014
comment
Лучше всего использовать инструмент XML для создания массива в виде списка, а затем инструмент JSON для преобразования списка в JSON.   -  person Hot Licks    schedule 25.02.2014
comment
@HotLicks, этот вопрос - как это сделать   -  person msangel    schedule 25.02.2014
comment
@msangel - Как что делать? Для обоих есть несколько инструментов — просто соедините два из них вместе.   -  person Hot Licks    schedule 25.02.2014


Ответы (2)


Существует библиотека underscore-java со статическим методом U.xmlToJson(xml). Он поддерживает специальный атрибут array=true, который заставляет элемент быть массивом.

<project id="200">
    <name>test</name>
    <elements>
        <element array="true">
            <id>body</id>
            <width>200</width>
            <height>400</height>
            <children/>
        </element>
    </elements>
</project>

Выход:

{
  "project": {
    "-id": "200",
    "name": "test",
    "elements": [
      {
        "id": "body",
        "width": "200",
        "height": "400",
        "children": {
          "-self-closing": "true"
        }
      }
    ]
  },
  "#omit-xml-declaration": "yes"
}    
person Valentyn Kolesnikov    schedule 15.01.2020
comment
Я знаю, что у нас есть РЕЖИМ для замены значения самозакрывающейся части на нулевое, есть ли у нас какой-либо РЕЖИМ для замены на ПУСТОЙ - person Nagendra Busam; 18.09.2020
comment
Я могу добавить новый режим REPLACE_SELF_CLOSING_WITH_EMPTY. - person Valentyn Kolesnikov; 19.09.2020
comment
Он будет доступен в ближайшем релизе. - person Valentyn Kolesnikov; 26.09.2020
comment
Есть ли конфигурация/способ отказаться от ключа #omit-xml-declaration из ответа? - person Nagendra Busam; 17.11.2020
comment
Мы можем исключить ключи с помощью метода U.remove(map, key). В качестве альтернативы вы можете добавить заголовок xml. - person Valentyn Kolesnikov; 17.11.2020

Отвечая на ваш 1-й вопрос: What is the proper way to represent an array in xml?

См.: http://www.w3.org/2005/07/xml-schema-patterns.html#Vector

person andilabs    schedule 25.02.2014