XStream анализирует JSON без корневого узла

В настоящее время я десериализую JSON с помощью XStream, и он отлично работает. Однако, когда у меня есть строка JSON, подобная следующей

{
    key1: { an_object: { something: 'foobar' } },
    key2: { another_object: { data: 'hi' }
}

в частности, у него нет корневого узла, я не знаю, как его разобрать. По сути, я хочу, чтобы для десериализации было противоположно DROP_ROOT_NODE.


person Josh Braegger    schedule 11.08.2009    source источник
comment
Похоже, разговор об этом шел, и это имеет смысл. он основан на синтаксическом анализаторе XML, а XML должен содержать корневой узел. Похоже, ответ - не может. nabble.com/Serializing-JSON-with-no-root --td21732630.html   -  person Josh Braegger    schedule 12.08.2009


Ответы (3)


Короткий ответ: «Вы не можете».

XStream должен знать, экземпляр какого класса создавать, он получает это знание из данных JSON (или XML). Имя класса может быть псевдонимом, но его нельзя опускать. Вы можете обойти это:

  1. Ручная обертка вашей строки JSON с корневым узлом, содержащим имя вашего класса (или псевдоним)
  2. Написание собственного ридера, который сделает это за вас. Однако в этом случае вам все равно нужно будет передать имя вашего класса (псевдоним) этому читателю либо явно, либо по соглашению (например, всегда добавляйте «root», но затем настраивайте его как псевдоним для вашего класса в экземпляре XStream) - так что я не не думаю, что это чище, чем № 1.
person ChssPly76    schedule 11.08.2009
comment
Можете ли вы привести пример того, как сделать вариант 2? - person portfoliobuilder; 01.07.2016

Я знаю, что это старый вопрос, но я опубликую свое решение после целого утра поиска в Google. Ответ заключается в предоставлении фиктивного корневого узла (начальный и завершающий теги). Для этого одним из ваших лучших друзей является SequenceInputStream:

Мой код следующий:

        reader = new XppDriver().createReader(new SequenceInputStream(
        Collections.enumeration(Arrays.asList(
        new InputStream[] {
                new ByteArrayInputStream("<PlatformAuditEvents>".getBytes()),
                new FileInputStream(file),
                new ByteArrayInputStream("</PlatformAuditEvents>".getBytes())
            }))
    ));
    in = xstream.createObjectInputStream(reader);

Здесь я смешал три объекта InputStream, первый и третий из которых предоставляют необходимые теги, отсутствующие в обрабатываемом файле.

Это решение было вдохновлено этим SO Question. Надеюсь, это поможет кому-то.

person Juan Carlos González    schedule 08.03.2013

Используйте приведенный ниже код:

XStream xstream = new XStream(new JsonHierarchicalStreamDriver() {
    public HierarchicalStreamWriter createWriter(Writer writer) {
        return new JsonWriter(writer, JsonWriter.DROP_ROOT_MODE);
    } });
person jayavardhan    schedule 17.02.2011
comment
Как насчет чтения JSON без корневого узла; есть ли пример кода, который вы можете предоставить? - person raffian; 22.01.2013