23

Jackson 2.0-RC3を使用してレガシーJSONコードを読み込もうとしていますが、「埋め込み」オブジェクトでスタックしています。

次の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

4

3 に答える 3

48

「埋め込まれた」オブジェクトを処理するには、使用する必要があります@JsonUnwrapped—これはHibernateの@Embeddable/と同等です@Embedded

class Item {
    private String title;

    @JsonProperty("date")
    private Date createdAt;

    // How to map this?
    @JsonUnwrapped
    private Author author;
}
于 2012-04-09T17:41:14.243 に答える
1

最初に元のJSONを単一のフラットオブジェクト(アダプターのようなもの)に逆シリアル化し、次に独自のドメインオブジェクトを作成します。

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

クラス は、次の形式からのみ自動的に逆シリアル化できますItem

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

カスタムデシリアライズで何かを行うことができるかもしれませんが、それは確かに簡単な解決策ではありません。

于 2012-04-05T23:15:57.170 に答える
0

注: 私はEclipseLink JAXB(MOXy)のリーダーであり、JAXB 2(JSR-222)エキスパートグループのメンバーです。

Jacksonがこのユースケースをサポートしているかどうかはわかりませんが、以下は、MOXyの@XmlPath拡張機能を活用して要件を満たす方法の例です。2012年4月7日以降のEclipseLink2.4.0ナイトリーラベルを使用する必要があることに注意してください。

アイテム

上のauthorプロパティItemはでマップされ@XmlPath('.')ます。これは、のコンテンツがのコンテンツとAuthor同じレベルに引き上げられることを意味しItemます。また、使用している形式がMOXyのデフォルトの表現と一致しないXmlAdapterため、プロパティにを使用する必要がありました。Date

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

著者

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

MOXyをJAXB(JSR-222)プロバイダーとして指定するには、次のエントリで呼び出されるファイルjaxb.propertiesをドメインクラスと同じパッケージに配置する必要があります。

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

詳細については

于 2012-04-06T20:19:50.943 に答える