Как десериализовать результат Json в POJO с помощью Restlet - PullRequest
1 голос
/ 01 апреля 2012

Я пытаюсь десериализовать результат Json из веб-сервиса в POJO.

ClientResource clientResource = new ClientResource("http://itunes.apple.com/search?term=marc+jordan&media=music&entity=album");
AlbumInfoResource resource = clientResource.wrap(AlbumInfoResource.class);
AlbumInfo albumInfo = resource.retrieve();

Полученное значение albumInfo равно нулю, исключение не выдается.
Я новичок в Рестлет , что я делаю не так?

Интерфейс:

public interface AlbumInfoResource {
  @Get
  public AlbumInfo retrieve();
 }

Результат Json от веб-службы выглядит следующим образом:

{
    "resultCount": 49,
    "results": [
        {
            "wrapperType": "collection",
            "collectionType": "Album",
            "artistId": 771969,
            "collectionId": 205639995,
            "amgArtistId": 4640,
            "artistName": "Marc Jordan",
            "collectionName": "This Is How Men Cry",
            "collectionCensoredName": "This Is How Men Cry",
            "artistViewUrl": "http://itunes.apple.com/us/artist/marc-jordan/id771969?uo=4",
            "collectionViewUrl": "http://itunes.apple.com/us/album/this-is-how-men-cry/id205639995?uo=4",
            "artworkUrl60": "http://a5.mzstatic.com/us/r30/Music/cd/3f/13/mzi.rxpvpvdd.60x60-50.jpg",
            "artworkUrl100": "http://a1.mzstatic.com/us/r30/Music/cd/3f/13/mzi.rxpvpvdd.100x100-75.jpg",
            "collectionPrice": 9.9,
            "collectionExplicitness": "notExplicit",
            "trackCount": 10,
            "copyright": "1999 Cafe Productions Inc.",
            "country": "USA",
            "currency": "USD",
            "releaseDate": "2006-11-07T08:00:00Z",
            "primaryGenreName": "Jazz"
        },
...
...
    }
]

}

Класс AlbumInfo:

public class AlbumInfo implements Serializable {

    private static final long serialVersionUID = 1L;

    private int _resultCount;
    private ArrayList<Album> _albums;

    public AlbumInfo() {
        _albums = new ArrayList<Album>();
    }

    public AlbumInfo(int resultCount, ArrayList<Album> albums) {
        _resultCount = resultCount;
        _albums = albums;
    }

    public int getResultCount() {
        return _resultCount;
    }

    public void setResultCount(int resultCount) {
        _resultCount = resultCount;
    }

    public ArrayList<Album> getAlbums() {
        return _albums;
    }

    public void setAlbums(ArrayList<Album> _albums) {
        this._albums = _albums;
    }

}

Класс Album был бы слишком большим, чтобы публиковать здесь, но я сопоставил элементы настолько разумно, насколько мог.

Ответы [ 4 ]

2 голосов
/ 02 апреля 2012

Если вы этого еще не сделали, вам нужно добавить JacksonConverter от Restlet в список зарегистрированных конвертеров:

    List<ConverterHelper> converters = Engine.getInstance().getRegisteredConverters();
    converters.add(new JacksonConverter());

и, конечно, добавьте org.restlet.ext.jackson.jar в путь сборки.

1 голос
/ 02 апреля 2012

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

Ниже описано, как это можно сделать с помощью MOXy, используя аннотации JAXB:

AlbumInfo

package forum9966753;

import java.io.Serializable;
import java.util.ArrayList;
import javax.xml.bind.annotation.*;

@XmlType(propOrder={"resultCount", "albums"})
public class AlbumInfo implements Serializable {

    private static final long serialVersionUID = 1L;

    private int _resultCount;
    private ArrayList<Album> _albums;

    public AlbumInfo() {
        _albums = new ArrayList<Album>();
    }

    public AlbumInfo(int resultCount, ArrayList<Album> albums) {
        _resultCount = resultCount;
        _albums = albums;
    }

    public int getResultCount() {
        return _resultCount;
    }

    public void setResultCount(int resultCount) {
        _resultCount = resultCount;
    }

    @XmlElement(name="results")
    public ArrayList<Album> getAlbums() {
        return _albums;
    }

    public void setAlbums(ArrayList<Album> _albums) {
        this._albums = _albums;
    }

}

Альбом

Ниже приведена уменьшенная версия вашего Album класса:

package forum9966753;

public class Album {

    private String wrapperType;

    public String getWrapperType() {
        return wrapperType;
    }

    public void setWrapperType(String wrapperType) {
        this.wrapperType = wrapperType;
    }

}

jaxb.properties

Чтобы указать MOxy в качестве вашего JAXB-провайдера, вам нужно добавить файл с именем jaxb.properties в тот же пакет, что и классы вашего домена, со следующей записью:

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

Demo

package forum9966753;

import java.io.InputStream;
import java.net.*;
import java.util.List;
import javax.xml.bind.*;
import javax.xml.transform.stream.StreamSource;
import org.example.Customer;

public class JavaSEClient {

    private static final String MEDIA_TYPE = "application/json";

    public static void main(String[] args) throws Exception {
        String uri = "http://itunes.apple.com/search?term=marc+jordan&media=music&entity=album";
        URL url = new URL(uri);
        HttpURLConnection connection =
            (HttpURLConnection) url.openConnection();
        connection.setRequestMethod("GET");
        connection.setRequestProperty("Accept", MEDIA_TYPE);

        JAXBContext jc = JAXBContext.newInstance(AlbumInfo.class);

        Unmarshaller unmarshaller = jc.createUnmarshaller();
        unmarshaller.setProperty("eclipselink.media-type", MEDIA_TYPE);
        unmarshaller.setProperty("eclipselink.json.include-root", false);
        InputStream xml = connection.getInputStream();
        AlbumInfo albumInfo = unmarshaller.unmarshal(new StreamSource(xml), AlbumInfo.class).getValue();
        connection.disconnect();

        Marshaller marshaller = jc.createMarshaller();
        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
        marshaller.setProperty("eclipselink.media-type", MEDIA_TYPE);
        marshaller.setProperty("eclipselink.json.include-root", false);
        marshaller.marshal(albumInfo, System.out);
    }

}

Вывод

Ниже приведен вывод запуска демо-кода.Поскольку образец модели домена содержит только пару свойств, выходные данные намного меньше, чем выходные данные.Отображения JAXB могут быть легко применены для сопоставления остальной части документа.

{
   "resultCount" : 49,
   "results" : [ {
      "wrapperType" : "collection"
   } ]
}

Для получения дополнительной информации

0 голосов
/ 11 июня 2015

Недавно мне пришлось разработать приложение для Android с платформой Restlet, и я потратил много времени, чтобы понять, как десериализовать JSONObject. Здесь я собираюсь объяснить мой метод. Я также опубликовал полное приложение для Android на GitHub здесь:
https://github.com/alchimya/android-restlet

Restlet 2.3.2 включает Gson lib. С Gson очень просто сопоставить и десериализовать ресурс.

1) Сопоставьте свою базу сущностей с классом следующим образом:

import com.google.gson.annotations.SerializedName;
import java.io.Serializable;

public class Album implements Serializable {

    @SerializedName("wrapperType")
    private String wrapperType;

    @SerializedName("collectionType")
    private String collectionType;

    @SerializedName("artistId")
    private String artistId;

    public String getWrapperType() {
        return wrapperType;
    }
    public void setWrapperType(String wrapperType) {
        this.wrapperType = wrapperType;
    }

    public String getCollectionType() {
        return collectionType;
    }
    public void setCollectionType(String collectionType) {
        this.collectionType = collectionType;
    }

    public String getArtistId() {
        return artistId;
    }
    public void setArtistId(String artistId) {
        this.artistId = artistId;
    }

    ......
    ......
    ......
}

Примечание: в предыдущем классе каждое свойство имеет аннотацию (@SerializedName) для сопоставления соответствующего поля JSON. Для получения дополнительной информации см. Этот учебник:
http://www.javacodegeeks.com/2011/01/android-json-parsing-gson-tutorial.html

2) Создайте класс с атрибутом List:

public class Albums {
    public List<Album> results;
}

3) Используйте ваш ресурс с помощью Restlet

String uri="http://itunes.apple.com/search?term=marc+jordan&media=music&entity=album";

ClientResource resource = new ClientResource(url);
Representation rep = resource.get();

JsonRepresentation represent = new JsonRepresentation(rep);
JSONObject jsonobject = represent.getJsonObject();
String jsonText = jsonobject.toString();

Gson gson = new Gson();
Albums response = gson.fromJson(jsonText, Albums.class);

В response.results будут все десериализованные предметы.

0 голосов
/ 01 апреля 2012

Попробуйте использовать JAXB annotations или Jersey для сопоставлений JSON. Это руководство может быть полезно для вас: ссылка

...