如何为json字符串编写通用的getObject()方法?

时间:2014-09-18 05:28:17

标签: java json gson

进入一个非常基本的问题。我必须将json字符串转换为对象。我有一个自定义方法,如果无法从中获取对象,则可以转换为相应的类并抛出异常。

protected <T> T getObjectFromJson(Class<T> c, String json){
    try{
        Gson gson = new Gson();
        T object = gson.fromJson(json, c);
        return object;
    } catch (Exception e){
        throw new TMMIDClassConversionException(e.getCause(), e.getMessage());
    }
}

问题是如果我试图转换另一个类的json,这个方法不会抛出异常。

我的班级

public class CompanyCategoryMap {

private Integer id;
private int mid;
private String catKey;
private String catValue;
private int priority;

public Integer getId() {
    return id;
}

public void setId(Integer id) {
    this.id = id;
}

public int getMid() {
    return mid;
}

public void setMid(int mid) {
    this.mid = mid;
}

public String getCatKey() {
    return catKey;
}

public void setCatKey(String catKey) {
    this.catKey = catKey;
}

public String getCatValue() {
    return catValue;
}

public void setCatValue(String catValue) {
    this.catValue = catValue;
}

public int getPriority() {
    return priority;
}

public void setPriority(int priority) {
    this.priority = priority;
}

}

当我传递Company的json字符串而不是上面的类的字符串时,它不会抛出异常。

字符串:

"{\"id\":6,\"name\":\"abc\",\"usersCount\":10,\"mid\":3,\"createdAt\":\"Sep 15, 2014 7:02:19 PM\",\"updatedAt\":\"Sep 15, 2014 7:02:19 PM\",\"active\":true,\"currency\":\"abc\",\"source\":\"unknown\",\"user_id\":1,\"tierId\":1}"

我认为我正在以错误的方式进行此转换。建议的方法是什么?

1 个答案:

答案 0 :(得分:1)

以例如:

class Foo {
    private String value;
}

class Bar {
    private String value;
}

String json = "{\"value\" : \"whatever\"}";
new Gson().fromJson(json, Foo.class);
new Gson().fromJson(json, Bar.class);

为什么Gson会拒绝这些?

Gson设置为尽最大努力将给定的JSON反序列化为给定Class的实例。它将映射尽可能多的字段。如果没有找到,那就太糟糕了。

像杰克逊这样的其他图书馆正好相反。默认情况下,Jackson拒绝任何不包含每个给定类属性映射的JSON。您也可以将其配置为忽略某些属性。

继续做你正在做的事。作为应用程序编写者,您应该知道何时使用具有适当JSON源的Class实例。