Улучшение преобразования массива для вызова отражения

#java #reflection #type-conversion

#java #отражение #преобразование типов

Вопрос:

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

  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:

Одной из альтернатив является использование возможностей объектного типа 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, что совершенно забыл об этом. В то время как в проекте я столкнулся с этой проблемой, это больше не имеет значения — вы напомнили мне важный момент. Еще раз спасибо!