2010-07-01 69 views
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个部分组成:

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: [email protected];行: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) at org.codehaus.jackson.map.deser.SettableBeanProperty $ MethodProperty.deserializeAndSet(SettableBeanProp erty.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

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

在另一方面

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

是只有一个字段的字段,所以不neccesary使bean它。

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

+0

:-) 看到我的答案,仍;确实,你不需要一个Bean,但是如果你必须的话,它也可以工作。 – StaxMan 2010-07-13 20:41:19

0

我猜这只是因为你的JSON代表一个数组,其中只有一个对象。您要求杰克逊将这些阵列数据反序列化到MetadataContentBean的一个实例上,这是它无法做到的。

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

+0

但是,这不是一个正确的解决方案,因为JSON文件是自动生成的,我有很多的他们。 无论如何,我尝试了相同的结果... :s 无论如何感谢 – 2010-07-01 11:10:04

+0

无论如何,MetadataContentBean是一个JSONObject,它需要从数组中的一个元素,所以它不应该是一个问题,应该吗? – 2010-07-01 11:14:27

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)不在其中。 为了使它工作,添加一个公共构造函数,它接受一个字符串参数,它应该工作。 如果你想要(或者它不是公共构造函数),你可以用@JsonCreator对它进行注释,但这不是必须的。

相反,如果你想序列化bean作为JSON字符串,你需要做这样的事情

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