Просто используйте это регулярное выражение - /[(,)]/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));
Я согласен с другим постером в том, что XStream не подходит - это OXM (Object / Xml Mapper), а JSON обрабатывается как вторичный выходной формат с использованием пути обработки XML. Вот почему необходимо "соглашение" (о том, как преобразовать иерархическую xml-модель в объектно-графовую модель json и наоборот); и ваш выбор сводится к использованию того, что менее навязчиво из неоптимальных вариантов. Это работает нормально, если XML является вашим основным форматом данных, и вам просто нужна элементарная поддержка JSON (-подобной).
Чтобы получить хорошую поддержку JSON, я бы подумал об использовании библиотеки обработки JSON, которая выполняет реальное сопоставление OJM (я предполагаю Свенсон тоже, но дополнительно), например:
Также: даже если вам действительно нужно поддерживать как XML, так и JSON, вам, IMO, лучше использовать отдельные библиотеки для этих задач - - объекты (бины) для использования на стороне сервера не должны отличаться, только библиотеки сериализации, которые конвертируют в / из xml и json.
Преобразователь типов 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\"}]");
Я понимаю, что это не по теме, но я хотел бы представить решение в 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);