2011-03-21 3 views
1

Я пытаюсь использовать jcouchdb (https://code.google.com/p/jcouchdb/) для доступа к экземпляру CouchDB с Java. У меня есть некоторые JSon-документы, которые я бы хотел проанализировать на Java-классах - с помощью Svenson, используемой в jcouchdb, и затем поместить эти анализируемые объекты в DB. Я генерирую эти объекты JSON с помощью AVRO (http://avro.apache.org) JSon Encoder, похоже, они в порядке, но, видимо, у других парсеров есть проблемы с ними.jcouchdb: svenson не удалось разобрать строку json

Моих JSon строк выглядит следующим образом:

{ 
    "id":40, 
    "event_id":"48764322212", 
    "note":{ 
     "string":"ABC note" 
    }, 
    "created_date":null, 
    "event_category":null, 
    "city":null, 
    "address":null 
} 

Что выглядит действительный JSON - подтвержден с http://jsonformatter.curiousconcept.com/

Однако мой объект Свенсона определяется следующим образом:

public class Note { 

    Long id; 
    String eventId; 
    String note; 
    String createdDate; 
    String eventCategory; 
    String city; 
    String address; 

    @JSONProperty() 
    public Long getId() { 

    @JSONProperty("event_id") 
    public String getEventId() { 

    @JSONProperty("note") 
    public String getNote() { 

    @JSONProperty("created_date") 
    public String getCreatedDate() { 

    @JSONProperty("event_category") 
    public String getEventCategory() { 

    @JSONProperty("city") 
    public String getCity() { 

    @JSONProperty("address") 
    public String getAddress() { 

} 

(сеттера и добытчики "умышленно удалены")

Ошибка при разборе является:

Cannot set property string on class java.lang.String 

кажется, что это JSON разобран правильно (есть разница в примечание поле):

{ 
    "id":40, 
    "event_case_id":"000-123123123", 
    "event_msisdn":"48764322212", 
    "note":"Planowana data portacji: 2011/01/27 11:42:49", 
    "created_date":null, 
    "event_category":null, 
    "city":null, 
    "address":null 
} 

Как я могу решить эту проблему? Возможно, есть еще одна библиотека json, которая будет работать для меня?

ответ

3

Вы объявляете заметку как java.lang.String:

public String getNote() 

но в формате JSON вы объявляете его как объект со свойством имени "строка":

"note":{ 
    "string":"ABC note" 
} 

Вы необходимо изменить JSON или Bean, чтобы они соответствовали друг другу. Например, во втором функционирующем JSON вы объявили примечание JSON как строку. Вот почему он работает.

+0

Хорошо, это кажется довольно очевидным + сообщение об ошибке. Не могли бы вы предложить, как я должен определить свой bean-компонент, чтобы приведенная выше строка JSON работала? Я не могу изменить созданный json Avro. –

+1

Я не могу проверить это прямо сейчас, но я думаю, вы должны использовать [type selection] (http://code.google.com/p/svenson/wiki/TypeSelection), чтобы сопоставить объект со свойством «string» с строкой , –

+0

Ну, добавление простого: parser.addTypeHint (". String", String.class) не помогло - следует ли использовать другой синтаксис соответствия? –

Смежные вопросы