【问题标题】:JSON string to Java object with JacksonJSON字符串到Java对象与杰克逊
【发布时间】:2014-03-05 14:33:50
【问题描述】:

这可能是标题说明一切的问题之一。

我对 ObjectMapper 的 readValue(file, class) 方法非常着迷,该方法位于 Jackson 库中,该方法从文件中读取 JSON 字符串并将其分配给对象。

我很好奇这是否可以通过简单地从字符串中获取 JSON 并将其应用于对象来实现。

某种替代的readValue() 方法,它采用String,而不是文件,并将其分配给对象?

例如,虽然默认的 readValue(file, class) 方法如下所示:

ObjectMapper mapper = new ObjectMapper();
Student student = mapper.readValue("C:\\student.json", Student.class);

我想知道 Jackson 中是否有某种方法允许以下操作:

ObjectMapper mapper = new ObjectMapper();
Student student = mapper.readValue("{\"id\":100,\"firstName\":\"Adam\"}", Student.class);

第二个例子接受一个字符串和一个类的对象,而第一个例子接受一个文件和一个类的对象。

我只是想删掉中间人,在这种情况下是文件。

这是可行的还是在 Jackson 的约束范围内不存在这种方法?

【问题讨论】:

标签: java json jackson json-deserialization


【解决方案1】:

试试这个,

你不能像你那样创建一个新的字符串。

    String string = "{\"id\":100,\"firstName\":\"Adam\"}";
    Student student = mapper.readValue(string, Student.class);

【讨论】:

  • 构造一个ObjectMapper比较昂贵;我不建议每次调用方法时都这样做。
  • 是的,当我看到它失败的原因是 OP 没有但他的字符串在 ""
  • 我是个彻头彻尾的白痴,问这个问题我感到很尴尬。谢谢你们帮助我消除迟钝。
  • 谢谢@djc391,我会的。谢谢你们没有让我对这样一个愚蠢的问题感到太可怕。
【解决方案2】:

您可以编写一个具有另一个 Generic 方法的辅助类,而不是在每个 mapper.readValue(json,Class) 中处理错误。

并使用

String jsonString = "{\"id\":100,\"firstName\":\"Adam\"}";
Student student = JSONUtils.convertToObject(jsonString,Student.class);

我将返回 null 并希望稍后打印跟踪和检查 null。您可以按自己的方式处理错误情况。

public class JSONUtils {
    public static String convertToJSON(Object object)
    {
        ObjectWriter ow = new ObjectMapper().writer().withDefaultPrettyPrinter();
        String json;
        try {
            json = ow.writeValueAsString(object);
        } catch (JsonProcessingException e) {
            e.printStackTrace();
            return convertToJSON(e);
        }
        return json;
    }


    public static <T> T convertToObject(Class<T> clazz,String jsonString)
    {
        try {
        ObjectMapper mapper = new ObjectMapper();
        return (T)mapper.readValue(jsonString, clazz);
        }catch(Exception e)
        {
            e.printStackTrace();
            return null;
        }
    }
}

【讨论】:

    猜你喜欢
    • 2016-10-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-11
    • 1970-01-01
    相关资源
    最近更新 更多