豆和杰克逊图书馆的问题

时间:2010-07-01 10:33:09

标签: java jackson

HI!

我正在使用.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] at   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)

任何帮助?提前谢谢!

3 个答案:

答案 0 :(得分:0)

我猜这只是因为你的JSON代表一个数组,里面有一个对象。您要求Jackson将此数组数据反序列化为MetadataContentBean的单个实例,而这是不可能做到的。

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

答案 1 :(得分:0)

问题在于关于sintaxis以及在我的程序中编写字段的方式。 你必须确保它是json文件中的SAME。

另一方面

“SourceFile”:“videos / KobeAlleyOop.flv”

是一个只有一个字段的字段,因此不需要为它创建一个bean。

这是一个愚蠢的错误,可以让你腰部很多时间! :■

答案 2 :(得分:0)

一个问题是你有不必要的代码:不需要第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值是String,但是你试图从中创建一个Object(bean)。 要使其工作,添加一个带有一个String参数的公共构造函数,它应该可以工作。 如果你想要(或者它不是公共构造函数),你可以用@JsonCreator注释它,但这不是必需的。

相反,如果要将bean序列化为JSON String,则需要执行类似

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