【问题标题】:Problem with beans and Jackson librarybean 和 Jackson 库的问题
【发布时间】:2010-07-01 10:33:08
【问题描述】:

嗨!

我正在使用 .json 文件,如下所示:

[{  
  "SourceFile": "videos/KobeAlleyOop.flv",  
  "ExifTool": {  
    "ExifToolVersion": 8.22,  
    "Warning": "Truncated 'mdat' data"  
  },  
  "System": {  
    "FileName": "KobeAlleyOop.flv",  
    "Directory": "videos",  
    "FileSize": "4.8 MB",  
    "FileModifyDate": "2010:06:15 14:57:24+02:00",  
    "FilePermissions": "rwxr-xr-x"  
  },  
  "File": {  
    "FileType": "MP4",  
    "MIMEType": "video/mp4"  
  }]  

我用 3 个组件制作了一个 Bean:

 public class MetadataContentBean {   
 SourceFileBean sourceFileBean;  
     FileBean fileBean;    
     SystemBean systemBean;   

     public FileBean getFileBean() {   return fileBean;  }   
 @JsonProperty("File")    
public void setFileBean(FileBean fileBean) {    
 this.fileBean = fileBean;    }   
 public SystemBean getSystemBean() {   
 return systemBean;    }   
 @JsonProperty("System")    
public void setSystemBean(SystemBean systemBean) {
 this.systemBean = systemBean;    }   
 public SourceFileBean
 getSourceFileBean() {    
 sourceFileBean.getSource();     return
 sourceFileBean;    }     
 @JsonProperty("SourceFile")    
public void setSourceFileBean(SourceFileBean
 sourceFileBean) {    
 this.sourceFileBean = sourceFileBean; 
 }   }

并且我添加了一个SourceFileBean的例子,其他的类似:

public class SourceFileBean {

 private String source;
 public String getSource() {
  return source;
 }
 @JsonProperty("SourceFile")
 public void setSource(String source) {
  this.source = source;
 }
}

在主程序中我调用:

InputStream is = this.getClass().getClassLoader().getResourceAsStream(filename);  
    String jsonTxt = IOUtils.toString(is);  
    JSONArray json = (JSONArray) JSONSerializer.toJSON(jsonTxt);  
    JSONObject metadatacontent = json.getJSONObject(0);  
    ObjectMapper mapper = new ObjectMapper();  mapper.readValue(metadatacontent.toString(),MetadataContentBean.class);

但是我运行它的时候得到这个错误,我不知道为什么:

org.codehaus.jackson.map.JsonMappingException: 无法构造实例 com.path.bean.SourceFileBean, 问题:没有合适的创建者方法 在 [来源: java.io.StringReader@12d7a10;线:1, 列:2] 在 org.codehaus.jackson.map.JsonMappingException.from(JsonMappingException.java:159) 在 org.codehaus.jackson.map.deser.StdDeserializationContext.instantiationException(StdDeserializationContext.java:212) 在 org.codehaus.jackson.map.deser.BeanDeserializer.deserializeFromString(BeanDeserializer.java:415) 在 org.codehaus.jackson.map.deser.BeanDeserializer.deserialize(BeanDeserializer.java:291) 在 org.codehaus.jackson.map.deser.SettableBeanProperty.deserialize(SettableBeanProperty.java:135) 在 org.codehaus.jackson.map.deser.SettableBeanProperty$MethodProperty.deserializeAndSet(SettableBeanProperty.java:221) 在 org.codehaus.jackson.map.deser.BeanDeserializer.deserializeFromObject(BeanDeserializer.java:390) 在 org.codehaus.jackson.map.deser.BeanDeserializer.deserialize(BeanDeserializer.java:286) 在 org.codehaus.jackson.map.ObjectMapper._readMapAndClose(ObjectMapper.java:1588) 在 org.codehaus.jackson.map.ObjectMapper.readValue(ObjectMapper.java:1116) 在 com.path.parser.JSon.Parser(JSon.java:65) 在 com.path.parser.JSon.main(JSon.java:29)

有什么帮助吗??提前致谢!

【问题讨论】:

    标签: java jackson


    【解决方案1】:

    我猜这只是因为您的 JSON 表示一个数组,其中包含一个对象。您要求 Jackson 将此数组数据反序列化到 MetadataContentBean 的单个实例上,但它无法做到。

    尝试从 JSOn 周围删除 [] 括号,然后重试。

    【讨论】:

    • 但这不是一个正确的解决方案,因为json文件是自动生成的,我有很多。无论如何,我尝试了相同的结果...:s 无论如何谢谢
    • 不管怎样,MetadataContentBean 是一个 JSONObject,它从数组中取一个元素,所以应该没问题吧?
    【解决方案2】:

    问题是关于 sintaxis 和在我的程序中写入字段的方式。 您必须绝对确定它与 json 文件中的相同。

    另一方面

    "SourceFile": "videos/KobeAlleyOop.flv"

    是一个只有一个字段的字段,所以没有必要为它制作一个bean。

    这是一个愚蠢的错误,可能会让你浪费很多时间!!! :s

    【讨论】:

    • :-) 看我的回答,还是;确实你不需要 Bean,但如果你需要,它也可以工作。
    【解决方案3】:

    其中一个问题是您有不必要的代码:第 3 行和第 4 行是不需要的,可能会导致问题。所以就这样做吧:

      InputStream is = this.getClass().getClassLoader().getResourceAsStream(filename);  
      String jsonTxt = IOUtils.toString(is);  
      ObjectMapper mapper = new ObjectMapper(); 
      MetadataContentBean[] beans = mapper.readValue(metadatacontent.toString(),MetadataContentBean[].class);
    

    所以你不必在那里使用 json.org 的解析器。这可能无法解释确切的问题,但有助于避免次要问题。

    但是引发异常的具体问题很简单(r):类型的 JSON 值是字符串,但您正试图从中创建一个对象(bean)。 为了让它工作,添加一个带有一个 String 参数的公共构造函数,它应该可以工作。 如果需要(或者如果它不是公共构造函数),您可以使用 @JsonCreator 对其进行注释,但这不是必需的。

    相反,如果你想将一个 bean 序列化为 JSON 字符串,你需要做类似的事情

    @JsonValue public String asString() { return valueOfThisAsString; }
    

    【讨论】:

      猜你喜欢
      • 2016-02-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-17
      • 2013-04-08
      • 1970-01-01
      • 2021-11-28
      • 2015-08-21
      相关资源
      最近更新 更多