2010-07-01 5 views
2

HI!Problème avec les haricots et la bibliothèque Jackson

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'ajoute 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: Impossible de construire instance de com.path. bean.SourceFileBean, problème: aucune méthode de création appropriée trouvé à [Source: [email protected]; 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) au 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)

Toute aide? Merci d'avance!

Répondre

0

Le problème concernait la syntaxe et la manière d'écrire les champs dans mon programme. Vous devez être absolument sûr que c'est le même que dans le fichier json.

D'autre part

« SourceFile »: « vidéos/KobeAlleyOop.flv »

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

C'est une erreur stupide qui pourrait vous faire perdre beaucoup de temps !!! : s

+0

:-) Voir ma réponse, toujours; il est vrai que vous n'avez pas besoin d'un haricot, mais si vous le devez, vous pouvez le faire fonctionner. – StaxMan

0

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

Essayez de retirer les crochets [] du JSOn, puis réessayez.

+0

Mais ce n'est pas une bonne solution, car les fichiers JSON sont générés automatiquement, et j'ai beaucoup de leur. En tout cas, j'ai essayé avec le même résultat ... : s Merci quand même –

+0

Quoi qu'il en soit, MetadataContentBean est un JSONObject, et il prend un élément du tableau, donc ça ne devrait pas poser de problème, n'est-ce pas? –

0

Un problème est que vous avez du code inutile: les lignes 3 et 4 ne sont pas nécessaires et pourraient causer des problèmes. Alors faites juste:

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

donc vous n'avez pas besoin d'utiliser l'analyseur de json.org là-dedans. Cela peut ne pas expliquer le problème exact, mais permet d'éviter les problèmes secondaires.

Mais le problème spécifique qui déclenche une exception est simple (r): La valeur JSON pour le type est String, mais vous essayez d'en faire un Object (bean). Pour que cela fonctionne, ajoutez un constructeur public qui prend un argument String, et cela devrait fonctionner. Vous pouvez l'annoter avec @JsonCreator si vous le souhaitez (ou s'il ne s'agit pas d'un constructeur public), mais cela ne devrait pas être nécessaire.

À l'inverse, si vous voulez sérialiser un haricot JSON chaîne, vous devez faire quelque chose comme

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