Как часть API, который я создаю, я разрешил спецификацию конфигураций (это может быть любой формат хранения, только одна реализация — с Json). Как часть этого, мой код не будет знать, что на самом деле содержит конфигурация. Я использую библиотеку Gson для чтения конфигурации, реализованной в json, однако я столкнулся с проблемой в том, как с ней обрабатываются числа. Мой текущий код использует рекурсию для чтения внутренних объектов и содержит следующее:
private JsonConfigurationSection readObject(JsonReader in) throws IOException {
JsonConfigurationSection section = new JsonConfigurationSection();
in.beginObject();
while (in.peek() != JsonToken.END_OBJECT) {
String name = in.nextName();
switch (in.peek()) {
case BEGIN_OBJECT: {
section._internal.put(name, readObject(in));
}
break;
case BEGIN_ARRAY: {
in.beginArray();
List<String> array = new LinkedList<>();
while (in.peek() != JsonToken.END_ARRAY) {
array.add(in.nextString());
}
in.endArray();
section._internal.put(name, array);
}
break;
case BOOLEAN: {
boolean next = in.nextBoolean();
section._internal.put(name, next);
}
break;
case NUMBER: {
//read the next number, whether long, int, or double
section._internal.put(name, next);
}
break;
case STRING: {
String next = in.nextString();
section._internal.put(name, next);
}
break;
}
}
in.endObject();
}
Класс JsonConfigurationSection — это просто оболочка для Map:
class JsonConfigurationSection implements ConfigurationSection {
final Map<String, Object> _internal = new TreeMap<>();
//methods being inherited, just getters for data from the map
}
Примером конфигурации может быть
{
"server": {
"ip": "127.0.0.1",
"port": 3306
}
"someval": 33.4
}
Возникшая проблема заключается в том, что JsonReader предоставляет только следующий токен для «Числа», но затем определенные геттеры для длинных, двойных и целых чисел.
Каков наилучший способ получить это число без потери данных и с использованием для него «лучшего» хранилища? (Я готов отказаться от длинных позиций, но предпочитаю посмотреть, смогу ли я сохранить их для последовательности)
nextString
, чтобы получить число, а затем передать это значение в новыйBigDecimal
и пустьBigDecimal
определит, является ли это двойным или целым числом. - person Lucas Ross   schedule 03.03.2015