Вопрос по java, json – Читать встроенный объект в Джексоне

14

Я пытаюсь прочитать устаревший код JSON, используя Jackson 2.0-RC3, однако я застрял с "встроенным" объект.

Учитывая следующее JSON:

{
    "title": "Hello world!",
    "date": "2012-02-02 12:23:34".
    "author": "username",
    "author_avatar": "http://.../",
    "author_group": 123,
    "author_prop": "value"
}

Как я могу отобразить это в следующую структуру:

class Author {
    @JsonPropery("author")
    private String name;

    @JsonPropery("author_avatar")
    private URL avatar;

    @JsonProperty("author_group")
    private Integer group;

    ...
}

class Item {
    private String title;

    @JsonProperty("date")
    private Date createdAt;

    // How to map this?
    private Author author;
}

Я пытался сделать это с@JsonDeserialize но мне кажется, что мне нужно отобразить всюItem возражать таким образом.

Ваш Ответ

3   ответа
1

адаптера), а затем создал ваши собственные доменные объекты.

class ItemLegacy {
    private String title;

    @JsonProperty("date")
    private Date createdAt;

    @JsonPropery("author")
    private String name;

    @JsonPropery("author_avatar")
    private URL avatar;

    @JsonProperty("author_group")
    private Integer group;

    @JsonProperty("author_prop")
    private Integer group;
}

Затем используйте этот объект, чтобы заполнить ваши объекты Item и Author и создать правильные отношения.

 //... the deserialized original JSON
 ItemLegacy legacy ...

 // create an author
 Author author = new Author();
 author.setName(legacy.getName());
 author.setGroup(legacy.getGroup());
 ...

 // create an item
 Item item = new Item();
 item.setTitle(legacy.getTitle());
 ...

 // finally set the author... and you should have the desired structure
 item.setAuthor(author);

Your Item учебный классcould only be automatically deserialized from следующая форма:

{
    "title": "Hello world!",
    "date": "2012-02-02 12:23:34".
    "author": { 
                "name": "username", 
                "author_avatar": "http://...", 
                "author_group": "123", 
                "author_prop": "value" 
              }
}

Возможно, вы сможете что-то сделать с помощью пользовательской десериализации, но это наверняка не будет более простым решением.

Error: User Rate Limit Exceeded
Error: User Rate Limit ExceededdeserializeError: User Rate Limit Exceeded Crozin
Error: User Rate Limit Exceeded@Embeddable/@Embedded. Crozin
Error: User Rate Limit Exceeded
35

встроенным & quot; объект, который вы должны использовать@JsonUnwrapped & # X2014; это эквивалент Hibernate's@Embeddable/@Embedded.

class Item {
    private String title;

    @JsonProperty("date")
    private Date createdAt;

    // How to map this?
    @JsonUnwrapped
    private Author author;
}
0

Note:  ЯEclipseLink JAXB (MOXy) привести и членJAXB 2 (JSR-222) экспертная группа.

Я не уверен, что Джексон поддерживает этот вариант использования, но ниже приведен пример того, как вы можете использовать MOXy.@XmlPath расширение для удовлетворения ваших требований. Обратите внимание, что вам нужно будет использовать ночной ярлык EclipseLink 2.4.0 с 7 апреля 2012 г. или новее.

http://www.eclipse.org/eclipselink/downloads/nightly.php

Item

author собственность наItem сопоставляется с@XmlPath('.'), Это означает, что содержаниеAuthor подтягивается до того же уровня, что и содержание дляItem, Мне также нужно было использоватьXmlAdapter дляDate Свойство как формат, который вы используете, не соответствует представлению MOXy по умолчанию.

package forum10036530;

import java.util.Date;
import javax.xml.bind.annotation.*;
import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
import org.eclipse.persistence.oxm.annotations.XmlPath;

@XmlAccessorType(XmlAccessType.FIELD)
class Item {
    private String title;

    @XmlElement(name="date")
    @XmlJavaTypeAdapter(DateAdapter.class)
    private Date createdAt;

    @XmlPath(".")
    private Author author;
}

Author

package forum10036530;

import java.net.URL;
import javax.xml.bind.annotation.*;

@XmlAccessorType(XmlAccessType.FIELD)
class Author {
    @XmlElement(name="author")
    private String name;

    @XmlElement(name="author_avatar")
    private URL avatar;

    @XmlElement(name="author_group")
    private Integer group;

    @XmlElement(name="author_prop")
    private String prop;
}

DateAdapter

package forum10036530;

import java.text.SimpleDateFormat;
import java.util.Date;
import javax.xml.bind.annotation.adapters.XmlAdapter;

public class DateAdapter extends XmlAdapter<String, Date> {

    private SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");

    @Override
    public Date unmarshal(String string) throws Exception {
        return dateFormat.parse(string);
    }

    @Override
    public String marshal(Date date) throws Exception {
        return dateFormat.format(date);
    }

}

jaxb.properties

Файл называетсяjaxb.properties следующая запись должна быть помещена в тот же пакет, что и классы домена, чтобы указать MOXy в качестве поставщика JAXB (JSR-222).

javax.xml.bind.context.factory = org.eclipse.persistence.jaxb.JAXBContextFactory

input.json/Output

{
   "title" : "Hello world!",
   "date" : "2012-02-02 12:23:34",
   "author" : "username",
   "author_avatar" : "http://www.example.com/foo.png",
   "author_group" : 123,
   "author_prop" : "value"
}

For More Information

http://blog.bdoughan.com/2010/07/xpath-based-mapping.html http://blog.bdoughan.com/2011/08/json-binding-with-eclipselink-moxy.html http://blog.bdoughan.com/2011/08/binding-to-json-xml-geocode-example.html
Error: User Rate Limit Exceeded Crozin
Error: User Rate Limit Exceeded

Похожие вопросы