我有一个定义为Object [] []的变量参数使我的app能够向函数发送一系列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();
}
答案 0 :(得分: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)
答案 1 :(得分:0)
您可以查看GSON。
答案 2 :(得分:0)
您可以构建自己的类来防止这种不安全的混乱。或者你可以使用一个框架(GSON在Android上运行良好,杰克逊有问题,但对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;
}
}
具有此装饰器模式的downer是字符串的用法。你不能从字符串固有,所以你可以写这样的替换:
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框架时才有效。
你用什么?
答案 3 :(得分:0)