2

你好!

我正在使用 .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 的实例,问题:在 [Source: java.io.StringReader@12d7a10; 找不到合适的创建者方法;line: 1, column: 2] at org.codehaus.jackson.map.JsonMappingException.from(JsonMappingException.java:159) at org.codehaus.jackson.map.deser.StdDeserializationContext.instantiationException(StdDeserializationContext.java:212) at org .codehaus.jackson.map.deser.BeanDeserializer.deserializeFromString(BeanDeserializer.java:415) at org.codehaus.jackson.map.deser.BeanDeserializer.deserialize(BeanDeserializer.java:291) at org.codehaus.jackson.map.deser .SettableBeanProperty.deserialize(SettableBeanProperty.java:135) 在 org.codehaus.jackson.map.deser.SettableBeanProperty$MethodProperty.deserializeAndSet(SettableBeanProperty.java:

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

4

3 回答 3

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 值是字符串,但您正试图从中创建一个对象(bean)。为了让它工作,添加一个带有一个 String 参数的公共构造函数,它应该可以工作。如果需要(或者如果它不是公共构造函数),您可以使用 @JsonCreator 对其进行注释,但这不是必需的。

相反,如果要将 bean 序列化为 JSON 字符串,则需要执行类似的操作

@JsonValue public String asString() { return valueOfThisAsString; }
于 2010-07-09T23:26:13.080 回答
0

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

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

于 2010-07-01T10:44:07.103 回答
0

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

另一方面

“SourceFile”:“视频/KobeAlleyOop.flv”

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

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

于 2010-07-02T07:55:33.850 回答