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)
任何帮助?提前谢谢!
答案 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; }