Question

HI!

Je travaille avec un fichier .json, comme ceci:

[{  
  "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"  
  }]  

J'ai fait un haricot avec 3 composants:

 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; 
 }   }

Et j'ajouter un exemple de SourceFileBean, les autres sont similaires:

public class SourceFileBean {

 private String source;
 public String getSource() {
  return source;
 }
 @JsonProperty("SourceFile")
 public void setSource(String source) {
  this.source = source;
 }
}

Dans le programme principal que je fais cet appel:

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);

Mais je reçois cette erreur quand je le lance, je ne sais pas pourquoi:

  

org.codehaus.jackson.map.JsonMappingException:   Ne peut pas construire instance de   com.path.bean.SourceFileBean,   problème: aucune méthode de création appropriée   trouvé à [Source:   java.io.StringReader@12d7a10; ligne 1,   colonne: 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)   à   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)

Toute aide ?? Merci à l'avance!

Était-ce utile?

La solution 2

Le problème était sur le point sintaxis et la façon de les champs dans writting mon programme. Vous devez être sûr que ce absotuely est le même que dans le fichier JSON.

D'autre part

"SourceFile": "vidéos / KobeAlleyOop.flv"

est un champ avec un seul champ, est donc pas faire neccesary un haricot pour elle.

Il est une erreur stupide qui pourrait vous faire taille beaucoup de temps !!! : S

Autres conseils

Je suppose que cela est juste parce que votre JSON représente un tableau, avec un seul objet à l'intérieur. Vous vous demandez Jackson désérialiser ces données de tableau sur une seule instance de MetadataContentBean, qui ne peut pas faire.

Essayez de supprimer les crochets de [] du monde JSON, et essayez à nouveau.

Un problème est que vous avez le code inutile là: lignes 3 et 4 ne sont pas nécessaires et pourraient causer des problèmes. Il suffit donc de faire:

  InputStream is = this.getClass().getClassLoader().getResourceAsStream(filename);  
  String jsonTxt = IOUtils.toString(is);  
  ObjectMapper mapper = new ObjectMapper(); 
  MetadataContentBean[] beans = mapper.readValue(metadatacontent.toString(),MetadataContentBean[].class);

de sorte que vous ne devez pas utiliser l'analyseur de json.org là-dedans. Cela peut ne pas expliquer problème exact mais permet d'éviter des problèmes secondaires.

Mais le problème spécifique qui génère une exception est simple (r): valeur JSON pour le type est une chaîne, mais vous essayez de faire un objet (haricot) hors de lui. Pour ce faire le travail, ajoutez un constructeur public qui prend un argument chaîne, et cela devrait fonctionner. Vous pouvez annoter avec @JsonCreator si vous voulez (ou si ce n'est pas constructeur public), mais cela ne devrait pas être nécessaire.

A l'inverse, si vous voulez sérialiser un haricot JSON String, vous devez faire quelque chose comme

@JsonValue public String asString() { return valueOfThisAsString; }
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top