Jackson /他のライブラリを使用してjson応答オブジェクトを優先フォーマットにマッピングするにはどうすればよいですか?

素晴らしい質問

サードパーティのWebサービスから以下のJSON応答形式を取得しています。

{
    "meta": {
        "code": 200,
        "requestId": "1"
    },
    "response": {
        "locations": [
            {
                "id": "1",
                "name": "XXX",
                "contact": {
                    phone: '123',
                    email: 'abc'
                },
                "location": {
                    "address": [
                        "Finland"
                    ]
                }
            },
            {
                // another location
            }
        ]
    }
}

そして、これが私自身のWebサービスからの応答として返すべきものです。

[
    {
        "id": "1",
        "name": "XXX",
        "phone": '123',
        "address": "Finland"
    },
    {
        // another location
    }
]

私は何をすべきか?ジャクソンについていくつか良いことを読みましたが、いくつかの単純なJSONobjをそのままPOJOにマップする簡単な例はほんのわずかです。私の場合、いくつかのノードを削除し、階層をさらに深くトラバースしてネストされた値を取得する必要があります。これは私の春のブートアプリでのこれまでの私の赤ちゃんのステップです:

    @GET
    @Path("{query}")
    @Produces("application/json")
    public String getVenues(@PathParam("query") String query){
        return client.target(url).queryParam("query",query).request(...).get(String.class)
    }

任意のヘルプ、ポインタ、推奨事項を歓迎します!

オタク

SpringWebサービスアノテーションの代わりにJAX-RSアノテーションを使用しています。これを機能させることはできますが、Spring Boot Starterの依存関係を使用している場合は、すべて自動構成されるため、デフォルトのSpringアノテーションを使用することをお勧めします。

まず、リクエストやレスポンスのように設定されたクラスを作成する必要があります。このようなもの:

public class ThirdPartyResponse {   
    MetaData meta;
    Response response;
}

public class Response {
    List<Location> locations;
}

public class MetaData {
    String code;
    String requestId;    
}

public class Location {
    String id;
    String name;
    Contact contact;
    LocationDetails location;
}

public class Contact {
    String phone;
    String email;
}

public class LocationDetails {
    List<String> address;
}

Jacksonアノテーションを使用して逆シリアル化をカスタマイズできますが、デフォルトでは、名前と予想されるタイプによってフィールドにかなり論理的にマップされます(「locations」という名前のJSONリストは「locations」という名前のオブジェクトのリストにマップされます)。 。

次に@RestController、サービスに注釈付きクラスを使用します。これによりRestTemplate、次のようなものを使用してサードパーティサービスにサービス呼び出しが行われます

@RestController
public class Controller {

    @Value("${url}")
    String url;

    @RequestMapping("/path"
            method = RequestMethod.GET,
            produces = MediaType.APPLICATION_JSON_VALUE)
    public List<Location> locations(@RequestParam String query) {

        // RestTemplate will make the service call and handle the 
        // mapping from JSON to Java object

        RestTemplate restTemplate = new RestTemplate();
        ThirdPartyResponse response = restTemplate.getForObject(url, ThirdPartyResponse.class);

        List<Location> myResponse = new List<>();            

        // ... do whatever processing you need here ...

        // this response will be serialized as JSON "automatically"
        return myResponse;
    }
}

ご覧のとおり、Spring BootはJSON処理の多くを抽象化し、非常に簡単にします。

非常に役立つSpringのガイドをご覧ください。

RestTemplateでサービスを利用するhttp://spring.io/guides/gs/sumption-rest/

@RestControllerを使用したWebサービスの作成https://spring.io/guides/gs/rest-service/

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

Related 関連記事

ホットタグ

アーカイブ