【问题标题】:Improving Conversion of Array for Reflection Invocation改进反射调用的数组转换
【发布时间】:2011-05-03 19:05:37
【问题描述】:

我有三个数组(大小相同):

  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 方法更好的选择?强>

【问题讨论】:

    标签: java reflection type-conversion


    【解决方案1】:

    另一种方法是使用 JSON 的对象类型功能。与其指定所有字符串的 JSON 数组,不如将值定义为数字、布尔值等...通过这样做,您正在使用的 JSON 库(我假设来自 json.org 的 Java API)将能够自动转换值到适当的定义。

    这是一个例子:

    // 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 字符串和包含 Object 数组属性的 Java 对象之间直接转换时使用它。

    【讨论】:

    • 谢谢,我曾经用 only-strings-in-json-string 工作了很多,以至于我完全忘记了这一点。虽然在项目中我遇到了这个问题,但它不再重要了——你提醒了我一个重要的观点。再次感谢!
    猜你喜欢
    • 1970-01-01
    • 2019-04-09
    • 2012-09-07
    • 2021-02-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多