【问题标题】:Json To Java Object having Class<?> member variableJson To Java Object 具有 Class<?> 成员变量
【发布时间】:2014-03-07 18:18:19
【问题描述】:
public class A {

    private Class<?> dataType;
    public Class<?> getDataType() {
        return dataType;
    }
    public void setDataType(Class<?> dataType) {
        this.dataType = dataType;
    }

}
public class B {

   public static void main(String[] args) {

       try {
            File file = new File( "fileName.json");
            A a = new ObjectMapper().readValue(file, A.class);
          } catch (IOException io) {
                io.printStackTrace();
            }
   }
}
  • fileName.json 文件中的内容: { “数据类型”:“java.lang.String” }

  • 我收到错误:org.codehaus.jackson.map.JsonMappingException: 无法访问私有 java.lang.Class()(来自 java.lang.Class 类;未能设置访问权限:无法创建 java .lang.Class 构造函数可访问。

  • json 文件中是否存在错误的数据表示,如果是,那么任何人都可以建议我在 json 文件中正确的 A 类表示法。

【问题讨论】:

  • 我不熟悉 Jackson 更喜欢 GSON,但我有两点希望对您有所帮助:1)您不能像 Jackson 一样直接实例化 Class>不能——这是 JVM 的特权,但您可以使用 Class.forName(...) 按名称查找类实例; 2) Jackson 可能具有某种类似于 GSON 类型适配器的自定义(反)序列化机制。有了这两点,您可以尝试编写一个可以将 String 转换为 Class>. 的自定义序列化程序
  • 对我来说很好。 Jackson 提供了 ClassDeserializer 在 Jackson 1 和 Jackson 2 版本中执行此操作。

标签: java json jackson deserialization


【解决方案1】:
  • 我得到了解决方案:我们必须为此使用 Jackson 注释。所以重写A类。

导入 org.codehaus.jackson.annotate.JsonCreator;

导入 org.codehaus.jackson.annotate.JsonProperty;

公开课 A {

private Class<?> dataType;
public Class<?> getDataType() {
    return dataType;
}
public void setDataType(Class<?> dataType) {
    this.dataType = dataType;
}

@JsonCreator
public A(@JsonProperty("dataType") String dataType)
{ 
    try {
        this.dataType = Class.forName(dataType);
    } catch (ClassNotFoundException c) {
        c.printStackTrace();
    }
}

}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-07-11
    • 2021-05-05
    • 1970-01-01
    • 1970-01-01
    • 2015-01-07
    • 1970-01-01
    • 2017-02-19
    相关资源
    最近更新 更多