1

私はWebサービス(サーバー+クライアント)を書いています。サービスを作成でき、次のjsonが返されます

{
"cities": {
    "city": [
        {
            "name": "New Delhi",
            "population": "19M",
            "telephonecode": "011"
        },
        {
            "name": "Mumbai",
            "population": "21M",
            "telephonecode": "022"
        },
        {
            "name": "Chennai",
            "population": "10M",
            "telephonecode": "044"
        }
    ]
}

}

私のPOJOは

@XmlRootElement(name = "cities")
public class RestFulCities {

List<RestFulCity> restFulCityList;

@XmlElement(name = "city")
public List<RestFulCity> getRestFulCityList() {
    return restFulCityList;
}

public void setRestFulCityList(List<RestFulCity> restFulCityList) {
    this.restFulCityList = restFulCityList;
}
}

@XmlRootElement(name = "city")
public class RestFulCity {
private String name;
private String telephonecode;
private String population;

public RestFulCity(String name, String telephonecode, String population) {
    this.name = name;
    this.telephonecode = telephonecode;
    this.population = population;
}

public RestFulCity(City city) {
    this.name = city.getName();
    this.telephonecode = city.getTelephonecode();
    this.population = city.getPopulation();
}
@XmlElement
public String getName() {
    return name;
}
@XmlElement
public String getTelephonecode() {
    return telephonecode;
}

@XmlElement
public String getPopulation() {
    return population;
}
}

ここで、この json を POJO にマップするクライアントを作成して、Java に入力された RestFulCities オブジェクトを取得したいと考えています。

私のクライアントコードは以下の通りです:

public class Client {

static final String REST_URI = "http://localhost:8080/springrest/rest/";
static final String CITIES = "cities";
public static void main(String[] args) {

    String s = "";

    WebClient plainAddClient = WebClient.create(REST_URI);
    plainAddClient.path(CITIES).accept("application/json");
    s = plainAddClient.get(String.class);
    try {

        RestFulCities citiesObject = new ObjectMapper().readValue(s, RestFulCities.class);

        for(RestFulCity city : citiesObject.getRestFulCityList()) {
            System.out.println("----------START---------");
            System.out.println(city.getName());
            System.out.println(city.getPopulation());
            System.out.println(city.getTelephonecode());
            System.out.println("---------END----------");
        }

    } catch (JsonParseException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (JsonMappingException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}
 }

しかし、問題は次のとおりです。次の例外が発生しています

org.codehaus.jackson.map.exc.UnrecognizedPropertyException: Unrecognized field "cities"(Class com.techartifact.example.spring.model.RestFulCities), not marked as ignorable
 at [Source: java.io.StringReader@1d35bf2; line: 1, column: 12] (through reference    chain: com.techartifact.example.spring.model.RestFulCities["cities"])

以下のプロパティを使用している場合:

@JsonIgnoreProperties(ignoreUnknown = true)

私は例外を取得しませんが、私のrestFulCityListはnullであり、望ましくありません

助けてください

4

2 に答える 2

0

ObjectMapperJAXB アノテーションを使用しているため、正しいモジュールで適切に構成する必要があります。jackson-module-jaxb-annotationsプロジェクトが必要です。お気に入りの依存関係管理システムを使用して追加し、次のように使用します。

JaxbAnnotationModule module = new JaxbAnnotationModule();
// configure as necessary
objectMapper.registerModule(module);

注: これは Jackson 2.x 用です。Jackson 1.x はデフォルトで JAXB をサポートしていますが、そのバージョンはサポートされていません。

更新: JAXB アノテーションは XML システムとの相互運用に最適ですが、可能であれば、Jackson 独自のアノテーションを実際に使用する必要があります。これにより、jaxb モジュールと .xml ファイルの構成が不要になりますObjectMapper。また、JAXB には同等の機能がないため、Jackson にはアノテーションを介してのみ使用できる機能がいくつかあります。

于 2013-05-14T14:35:43.853 に答える
0

解決策を見つけました..

次のコードを使用します。

 JSONObject primary_contact = new JSONObject(s);
 String s1 = primary_contact.getString("cities");
 JSONObject primary_contact1 = new JSONObject(s1);
 String s2 = primary_contact1.getString("city");


 List<City> citiesList = new ObjectMapper().readValue(s2, new TypeReference<List<City>>() { });

クライアントコードは次のとおりです。

public class Client {

    static final String REST_URI = "http://localhost:8080/springrest/rest/";
    static final String CITIES = "cities";
    static final String CITIES_BHUVAN = "cities/bhuvan";
    static final String BHUVAN = "bhuvan";
    static final String BHUVAN_BHUVAN = "bhuvan/bhuvan";

    public static void main(String[] args) throws JSONException {

        String s = "";

        WebClient plainAddClient = WebClient.create(REST_URI);
        plainAddClient.path(CITIES).accept("application/json");
        s = plainAddClient.get(String.class);
        try {

            JSONObject primary_contact = new JSONObject(s);
            String s1 = primary_contact.getString("cities");
            JSONObject primary_contact1 = new JSONObject(s1);
            String s2 = primary_contact1.getString("city");


            List<City> citiesList = new ObjectMapper().readValue(s2, new TypeReference<List<City>>() { });

            for(City city : citiesList) {
                System.out.println("----------START---------");
                System.out.println(city.getName());
                System.out.println(city.getPopulation());
                System.out.println(city.getTelephonecode());
                System.out.println("---------END----------");
            }

        } catch (JsonParseException e) {
            e.printStackTrace();
        } catch (JsonMappingException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }


        WebClient xmlAddClient = WebClient.create(REST_URI);
        xmlAddClient.path(CITIES_BHUVAN).accept("application/json");
        s = xmlAddClient.get(String.class);
        System.out.println(s);

        WebClient plainSubClient = WebClient.create(REST_URI);
        plainSubClient.path(BHUVAN).accept("application/json");
        s = plainSubClient.get(String.class);
        System.out.println(s);

        WebClient xmlSubClient = WebClient.create(REST_URI);
        xmlSubClient.path(BHUVAN_BHUVAN).accept("application/json");
        s = xmlSubClient.get(String.class);
        System.out.println(s);
    }
}
于 2013-06-18T03:36:37.093 に答える