#java #reflection #type-conversion
#java #отражение #преобразование типов
Вопрос:
У меня есть три массива (одинакового размера):
JSONArray jsonArr
который содержит много строк.Class<?> classArr[]
который содержит типы параметров.Object objArr[]
который пока ничего не содержит (но мы сделаем его полным, я обещаю)
Мне нужно преобразовать каждую из строк в jsonArr в тип из того же индекса в classArr и поместить полученный объект в соответствующий индекс в objArr.
Например:
Array index | 1 | 2 | 3 | 4
-------------- --------- --------- --------- -------
jsonArr | "1" | "false" | "false" | "2"
classArr | int | boolean | String | char
Должно привести к:
objArr | 1 | false | "false" | 2
В настоящее время я использую следующий метод (в цикле для каждого объекта) для преобразования параметров и создания objArray
:
if (classArr[i].equals(int.class))
objArr[i] = Integer.parseInt(jsonArr.get(i));
else if (classArr[i].equals(boolean.class))
objArr[i] = Boolean.parseBoolean(jsonArr.get(i));
....
Для меня этот метод работает просто отлично, но мне интересно — есть ли лучший способ преобразовать JSONArray в типы, которые у меня есть в списке, или у меня нет лучшего варианта, чем if-else
подход?
Ответ №1:
Одной из альтернатив является использование возможностей объектного типа JSON. Вместо того, чтобы указывать массивы JSON всех строк, определите значения в виде чисел, логических значений и т.д… Таким образом, используемая вами библиотека JSON (я предполагаю, что Java API из json.org ), сможет автоматически преобразовывать значения в соответствующее определение.
Вот пример:
// JSON String: [1, false, "false", "2"] rather than ["1", "false", "false", "2"]
String jsonEx = "[1,false,"false","2"]";
// convert to JSONArray
JSONArray array = new JSONArray(jsonEx);
// print out values and types
for (int i = 0; i < array.length(); i ) {
Object o = array.get(i);
System.out.printf("%-8st:%sn", o,o.getClass());
}
Если вы запустите этот код, вы получите следующий результат:
1 :class java.lang.Integer
false :class java.lang.Boolean
false :class java.lang.String
2 :class java.lang.String
Как вы можете видеть, библиотека правильно преобразовала все типы данных, за исключением ожидаемого символа. Причина в том, что в JSON нет способа определить тип символа по сравнению со стандартной строкой. Если вы сможете обойти это ограничение, то такой подход должен сделать ваше приложение намного проще в обслуживании.
Другим преимуществом этого подхода является то, что вы можете использовать его во время прямого преобразования между строками JSON и объектами Java, содержащими атрибуты массива объектов.
Комментарии:
1. Спасибо, я так много работал с only-strings-in-json-string, что совершенно забыл об этом. В то время как в проекте я столкнулся с этой проблемой, это больше не имеет значения — вы напомнили мне важный момент. Еще раз спасибо!