在GWT中创建JSON字符串的更好方法是什么?

时间:2013-06-25 08:42:55

标签: java json gwt generics

我有一个定义为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();
}

4 个答案:

答案 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)

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