0

我有一个定义为 Object[][] 的变量参数,使我的应用程序能够将一系列 KEY/VALUE 对发送到函数。下面的代码处理字符串和整数的字符串、整数和数组列表。我想扩展它以支持双精度和布尔值(以及两者的 ArrayLists)。

该函数有很多重复的代码。

更新:我正在使用 GWT 框架。

Q1。这是正确的方法,但需要一个通用类来提供更容易的维护?如果有怎么办?Q2。有没有更好的替代方法?

final static int KEY = 0;
final static int VALUE = 1;
...
String buildParamaters(Object[][] arguments) {
    JSONObject parameters = new JSONObject();
    for (Object[] arg : arguments) {
        if (isType(arg[VALUE], "java.util.ArrayList")) {
            JSONArray array = new JSONArray();
            if (isType(arg[VALUE], "java.lang.Integer")) {
                ArrayList<String> values = (ArrayList<String>) arg[VALUE];
                for (int i=0; i<values.size(); i++) {
                    array.set(i, new JSONString(values.get(i)));
                }
            } else {
                ArrayList<Integer> values = (ArrayList<Integer>) arg[VALUE];
                for (int i=0; i<values.size(); i++) {
                    array.set(i, new JSONNumber(values.get(i)));
                }
            }
            parameters.put(arg[KEY].toString(), array);
        } else if (isType(arg[VALUE], "java.lang.Integer")) {
            parameters.put(arg[KEY].toString(), new JSONNumber(((Integer)arg[VALUE]).doubleValue()));
        } else {
            parameters.put(arg[KEY].toString(), new JSONString((String)arg[VALUE]));
        }
    }
    return parameters.toString();
}
4

4 回答 4

1

您应该使用像 Jackson 这样的框架,它能够将任何 Java 对象映射到 JSON,反之亦然:

public class User {

    private int age = 29;
    private String name = "mkyong";
    private List<String> messages = new ArrayList<String>() {
        {
            add("msg 1");
            add("msg 2");
            add("msg 3");
        }
    };

    //getter and setter methods

    @Override
    public String toString() {
        return "User [age=" + age + ", name=" + name + ", " +
                "messages=" + messages + "]";
    }
}

//1. Convert Java object to JSON format
ObjectMapper mapper = new ObjectMapper();
mapper.writeValue(new File("c:\\user.json"), user);

或者

//2. Convert JSON to Java object
ObjectMapper mapper = new ObjectMapper();
User user = mapper.readValue(new File("c:\\user.json"), User.class);

来源:http ://www.mkyong.com/java/how-to-convert-java-object-to-from-json-jackson/

(顺便说一句:您需要向用户添加 getter 和 setter)

于 2013-06-25T08:51:18.940 回答
0

您可以构建自己的类来防止这种不安全的混乱。或者您可以使用一个框架(GSON 在 Android 上运行良好,Jackson 有它的问题,但在 JavaSE 上运行良好)但如果您想要它更快且更小一点(例如,对于 android dev.),您可以这样做:

介绍一个接口:

public interface JSONRepresentable {
   public JSONValue getJsonValue();
}

有了这个,你可以引入这样的列表类:

public class IntList extends ArrayList<Integer> implements JSONRepresentable {
   @Override
   public JSONValue getJsonValue() {
       JSONArray arr = new JSONArray();
       int size = this.size();

       for(int i = 0; i < size; i++) { 
          arr.set(i, new JSONNumber(get(i)));
       }

       return arr;
   }
} 

这种装饰器模式的不利之处在于字符串的使用。你不能从字符串中继承,所以你会写一个这样的替换:

StringValue implements JSONRepresentable {
   private String val;

   public StringValue(String val) { this.val = val; }
   public StringValue() { this(""); }

   public String value() { return val; }
   public void setValue(String val) { this.val = val; }

   @Override
   public JSONValue getJsonValue() {
       return new JSONString(val);
   }
}

然后像上面一样为 ArrayList 实现你自己的 JSONRepresentable。

然后,您可以用 Map[String, JSONRepresentable] 替换您的 Object[][]。也许这对您来说并不完美,但它可以为您提供有关如何在不走反射路线的情况下解决该问题的指导。

与 GSON 或 Jackson 等基于反射的框架相比,这将非常快。但这仅在您使用具有此类层次结构的 JSON 框架时才有效。

你用什么?

于 2013-06-25T08:59:02.850 回答
0

你可以看看GSON

于 2013-06-25T08:52:54.470 回答
0

您可以使用GSON将 Java 对象转换为 JSON 数组,反之亦然。这个第 3 方工具是由 Google 团队自己开发的。使用它非常简单和安全。另一个类似的 GWT 第三方库是Jackson

于 2013-06-25T09:19:16.263 回答