Проблема с бобами и библиотекой Джексона - PullRequest
2 голосов
/ 01 июля 2010

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 компонентов:

 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: java.io.StringReader @ 12d7a10;строка: 1, столбец: 2] в org.codehaus.jackson.map.JsonMappingException.from (JsonMappingException.java:159) в org.codehaus.jackson.map.deser.StdDeserializationContext.instantiationException (StdDeserializationContext.javag2).codehaus.jackson.map.deser.BeanDeserializer.deserializeFromString (BeanDeserializer.java:415) в org.codehaus.jackson.map.deser.BeanDeserializer.deserialize (BeanDeserializer.java:291) в org.codehaus.jackson.SettableBeanProperty.deserialize (SettableBeanProperty.java:135) в org.codehaus.jackson.map.deser.SettableBeanProperty $ MethodProperty.deserializeAndSet (SettableBeanProperty.java:221) в org.sone.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)

Любая помощь ??Заранее спасибо!

Ответы [ 3 ]

0 голосов
/ 02 июля 2010

Проблема была в синтаксисе и способе записи полей в моей программе.Вы должны быть абсолютно уверены, что это то же самое, что и в файле json.

С другой стороны *

"SourceFile": "videos / KobeAlleyOop.flv"

isполе только с одним полем, поэтому не нужно создавать для него боб.

Это глупая ошибка, которая может затянуть вас много времени !!!: S

0 голосов
/ 10 июля 2010

Одна проблема заключается в том, что у вас есть ненужный код: строки 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, но вы пытаетесь выделить объект (бин)этогоЧтобы заставить его работать, добавьте открытый конструктор, который принимает один аргумент String, и он должен работать.Вы можете аннотировать его с помощью @JsonCreator, если хотите (или если это не публичный конструктор), но в этом нет необходимости.

И наоборот, если вы хотите сериализовать бин как строку JSON, вам нужно что-то сделатькак

@JsonValue public String asString() { return valueOfThisAsString; }
0 голосов
/ 01 июля 2010

Я предполагаю, что это просто потому, что ваш JSON представляет массив с одним объектом внутри. Вы просите Джексона десериализовать эти данные массива на один экземпляр MetadataContentBean, чего он не может сделать.

Попробуйте снять скобки [] вокруг JSOn и повторите попытку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...