В XStream там лучший путь к Списку Маршалла/неМаршалла <Объект> в JSON и Java

Просто используйте это регулярное выражение - /[(,)]/g. Смотрите его в прямом эфире ниже -

var x1 = '34(,12';
var x2 = '34),12';
var x3 = '34()12';
var x4 = '34,12';
var x5 = ',1)2(3';

x1 = x1.replace(/[(,)]/g, ' ');
x2 = x2.replace(/[(,)]/g, ' ');
x3 = x3.replace(/[(,)]/g, ' ');
x4 = x4.replace(/[(,)]/g, ' ');
x5 = x5.replace(/[(,)]/g, ' ');

console.log(x1);
console.log(x2);
console.log(x3);
console.log(x4);
console.log(x5);

Предложение: Вы можете выделить его, используя обобщенную функцию следующим образом -

var filterString = (str) => str.replace(/[(,)]/g, ' ');

var x = '3,4,5(6,7),1)2(3';

console.log(filterString(x));

9
задан Dougnukem 12 May 2009 в 05:29
поделиться

3 ответа

Я согласен с другим постером в том, что XStream не подходит - это OXM (Object / Xml Mapper), а JSON обрабатывается как вторичный выходной формат с использованием пути обработки XML. Вот почему необходимо "соглашение" (о том, как преобразовать иерархическую xml-модель в объектно-графовую модель json и наоборот); и ваш выбор сводится к использованию того, что менее навязчиво из неоптимальных вариантов. Это работает нормально, если XML является вашим основным форматом данных, и вам просто нужна элементарная поддержка JSON (-подобной).

Чтобы получить хорошую поддержку JSON, я бы подумал об использовании библиотеки обработки JSON, которая выполняет реальное сопоставление OJM (я предполагаю Свенсон тоже, но дополнительно), например:

Также: даже если вам действительно нужно поддерживать как XML, так и JSON, вам, IMO, лучше использовать отдельные библиотеки для этих задач - - объекты (бины) для использования на стороне сервера не должны отличаться, только библиотеки сериализации, которые конвертируют в / из xml и json.

6
ответ дан 4 December 2019 в 23:41
поделиться

Преобразователь типов svenson на основе полного имени класса будет выглядеть примерно так

public class ClassNameBasedTypeMapper extends PropertyValueBasedTypeMapper
{
    protected Class getTypeHintFromTypeProperty(String value) throws IllegalStateException
    {
        try
        {
            return Class.forName(value);
        }
        catch (ClassNotFoundException e)
        {
            throw new IllegalStateException(value + " is no valid class", e);
        }
    }
}

, что не является идеальной реализацией, поскольку оно наследует конфигурацию PropertyValueBasedTypeMapper без особой нужды. (должен включать более чистую версию в svenson)

Настройка очень похожа на приведенную выше

JSONParser parser = new JSONParser();
ClassNameBasedTypeMapper mapper = new ClassNameBasedTypeMapper();
mapper.setParsePathInfo("[]");
parser.setTypeMapper(mapper);

List foos = parser
    .parse( List.class, "[{\"type\":\"package.Foo\"},{\"type\":\"package.Bar\"}]");
0
ответ дан 4 December 2019 в 23:41
поделиться

Я понимаю, что это не по теме, но я хотел бы представить решение в svenson JSON .

Вам действительно нужны общедоступные поля в классах вашего домена ? Помимо необходимости использования свойств, svenson может обрабатывать такие случаи с помощью более простого вывода JSON со свойством дискриминатора

class Message
{
   // .. your properties with getters and setters .. 
   // special property "type" acts a signal for conversion
}

class MessageOther
{
  ...
}

List list = new ArrayList();
list.add(new Message());
list.add(new MessageOther());
list.add(new Message());

String jsonDataSet = JSON.defaultJSON().forValue(list);

выводит JSON, например

[
    {"type":"message", ... }, 
    {"type":"message_other", ... }, 
    {"type":"message", ... }
]

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

    // configure reusable parse instance
    JSONParser parser = new JSONParser();

    // type mapper to map to your types
    PropertyValueBasedTypeMapper mapper = new PropertyValueBasedTypeMapper();
    mapper.setParsePathInfo("[]");
    mapper.addFieldValueMapping("message", Message.class);
    mapper.addFieldValueMapping("message_other", MessageOther.class);
    parser.setTypeMapper(mapper);

    List list = parser.parse(List.class, jsonDataset);
0
ответ дан 4 December 2019 в 23:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: