Улучшение преобразования массива для вызова отражения - PullRequest
0 голосов
/ 03 мая 2011

У меня есть три массива (одинакового размера):

  1. JSONArray jsonArr, который содержит много строк.
  2. Class<?> classArr[], который содержит типы параметров.
  3. 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 Ответ

1 голос
/ 03 мая 2011

Одной из альтернатив является использование возможностей типа объекта 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("%-8s\t:%s\n", 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, содержащими атрибуты массива объектов.

...