当前位置: 首页 > 知识库问答 >
问题:

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

甄飞飙
2023-03-14

进入了一个非常基本的问题。我必须将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;
}

}

当我传递的是公司的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个答案

罗建弼
2023-03-14

例如:

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反序列化为给定类的实例。它将映射找到的尽可能多的字段。如果没有找到,那就太糟糕了。

其他库(如Jackson)则相反。默认情况下,Jackson拒绝任何不包含每个给定类属性的映射的JSON。您还可以将其配置为忽略某些属性。

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

 类似资料:
  • 问题内容: 是否可以在JSON中编写HTML字符串? 我想在JSON文件中编写如下内容: 问题答案: 您应该在HTML字符串中通过添加“ ** ” 来转义双引号等字符 例如:

  • 问题内容: 我想编写一种方法来判断string 是否是的子字符串。 要求仅使用 和的 方法 。 例如 不能使用。 这是我到目前为止所得到的。 测试类是: 它失败,因为它返回true。 问题答案: 如果第一个字符匹配,则代码返回true。您需要将第一个字符串的所有字符包含在第二个字符串的子字符串中。 编辑: 我的原始代码是错误的。这是正确的代码:

  • 问题内容: 我正在尝试在我的java类中编写几行HTML,该HTML行从另一个API获取一些数据。我以JSON字符串形式获取数据,然后将其显示在网页上。 要创建HTML,我尝试: 但是最终显示的是html标签的字面解释。有没有一种方法可以创建此字符串,以便标记将保留为标记而不是转义字符? Java类是托管bean,因此在html中,我具有: 其中fullLeadData是带有html的字符串。 问

  • 在我的项目(spring boot应用程序)中,我有大约200个测试用例。最近,我们为缓存管理器(ehcache)实现了一个工厂bean,它位于我的启动类(@SpringBootApplication)中。 我的问题是,一旦带有工厂bean的启动类被一个测试用例执行,所有后续的测试用例都会失败,并出现错误。。。 “同一个VM中已存在另一个同名“appCacheManager”的CacheManag

  • 我一直在和一个朋友练习面试问题,他把他编的这道题扔给我: 给定一个方法来告诉您一个字符串是否有效,请编写一个方法来获取一个字符串,并返回最长的有效子字符串(而不对字符重新排序)。 > 检查输入字符串 检查的所有子集,使用== 以此类推,直到检查所有长度为1的子集,然后返回false 但不幸的是,我很难理解。 最好的解决方案是在所有子集中进行深度优先的递归迭代,并从那里返回最长的有效字符串吗?

  • 问题内容: 我在JS中有一个JSON对象,我想将其转换为字符串。这是功能吗? 提前致谢, 问题答案: JSON.stringify() 将值转换为JSON,如果指定了replacer函数,则可以选择替换值,如果指定了replacer数组,则可以选择仅包括指定的属性。