質問
こんにちは!
私はこのような.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のインスタンスを構築できません、問題:[出典:java.io.stringreader@12d7a10;ライン:1、列:2] atorg.codehaus.jackson.map.jsonmappingexception.from(jsonmappingexception.java:159)at org.codehaus.jackson.map.deser.stddeserializationcontext.instantiationexception( .codehaus.jackson.map.deser.beandeserializer.deserializefromstring(beandeserializer.java:415)at org.codehaus.jackson.map.deser.beandeserializer.deserialize(beandeserializer.java:291.jackson.jackson.deserialize( org.codehaus.jackson.map.deser.settablebeanporty $ methodperty.deserializeandset(setablebeanProperty.java:221)at buand.cededdeddeddeddedsconsset.deser.setablebeanporty.deser.deser.deser.deser.deser.deser.deser.deser.deser.deser.deser.deser.deser.deser.deserialize(setablebeanproperty.java:135)のsettablebeanproperty.deserialize(setablebeanproperty.java:135) .java:390)at org.codehaus.jackson.map.deser.beandeserializer.deserialize(beandeserializer.java:286)at org.codehaus.jackson.map.objectmapper._readmapandclose(objectmaper.java:1588 at jackson.map.objectmapper.readvalue(objectmapper.java:1116)com.path.parser.jso n.parser(json.java:65)at com.path.parser.json.main(json.java:29)
何か助け??前もって感謝します!
解決 2
問題は、SINTAXISと私のプログラムでフィールドを書く方法についてでした。 JSONファイルと同じであることを妨げている必要があります。
一方で
「SourceFile」:「Videos/Kobealleyoop.flv」
1つのフィールドを持つフィールドなので、ネッカリーが豆を作ることではありません。
それはあなたが多くの時間を腰にすることができる愚かなエラーです!!! :s
他のヒント
これは、JSONがアレイを表しており、その中に単一のオブジェクトがあるという理由だけであると推測しています。ジャクソンに、この配列データを1つのインスタンスに脱着するよう求めています MetadataContentBean
, 、それはできません。
削除してみてください []
JSON周辺からのブラケット、そしてもう一度やり直してください。
1つの問題は、そこに不必要なコードがあることです。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)を作成しようとしています。それを機能させるには、1つの文字列引数を取得するパブリックコンストラクターを追加すると、機能するはずです。必要に応じて(またはパブリックコンストラクターではない場合)@jsoncreatorで注釈を付けることができますが、それは必要ないはずです。
逆に、BeanをJSON文字列としてシリアル化したい場合は、次のようなことをする必要があります
@JsonValue public String asString() { return valueOfThisAsString; }