web-dev-qa-db-ja.com

ジャージWebサービスjson utf-8エンコーディング

Jersey 1.11を使用して小さなRest Webサービスを作成しました。 Jsonを返すURLを呼び出すと、英語以外の文字の文字エンコードに問題があります。 Xmlの対応するURL( "test.xml"は、開始xml-tagでutf-8にします。

URL "test.json"がutf-8エンコードされた応答を返すようにするにはどうすればよいですか?

サービスのコードは次のとおりです。

@Stateless
@Path("/")
public class RestTest {   
    @EJB
    private MyDao myDao;

    @Path("test.xml/")
    @GET
    @Produces(MediaType.APPLICATION_XML )
    public List<Profile> getProfiles() {    
        return myDao.getProfilesForWeb();
    }

    @Path("test.json/")
    @GET
    @Produces(MediaType.APPLICATION_JSON)
    public List<Profile> getProfilesAsJson() {
        return myDao.getProfilesForWeb();
    }
}

これはサービスが使用するpojoです:

package se.kc.mimee.profile.model;

@XmlRootElement
public class Profile {
    public int id;
    public String name;

    public Profile(int id, String name) {
        this.id = id;
        this.name = name;
    }

    public Profile() {}

}
45
Jojje

Jerseyは常にデフォルトでutf-8を生成する必要があります。問題は、クライアントが正しく解釈していないように聞こえます(xml宣言はutf-8を「作成」せず、クライアントに解析方法を指示するだけです)。

これらの問題をどのクライアントで見ていますか?

有効なJSONはUnicode(utf-8/16/32)のみであると想定されています。パーサーはエンコードを自動的に検出できる必要があります(もちろん、そうでないものもあります)。そのため、JSONにはエンコード宣言はありません。

次のようにContent-Typeに追加できます:

@Produces(MediaType.APPLICATION_JSON + ";charset=utf-8")
95
Dmitri

すべてのリソースに文字セットを追加することがオプションではない場合、デフォルトの文字セットを適用する方法を示す この質問 に対する回答が役立つ場合があります。

5
martin

responseMessageは、UTF-8 charset に応じて。

return Response.ok(responseMessage).header("Content-Type", "application/json;charset=UTF-8").build();
3
Prem Kumar

@Produces(MediaType.APPLICATION_JSON + "; charset = utf-8")が機能しない場合は、次を試してください。

@Produces( "application/json; charset = utf-8")

理論的には同じですが、最初のオプションは私にはうまくいきませんでした

3
alexcornejo

これを試すこともできます:

return Response.ok(responseMessage, "application/json;charset=UTF-8").build();
0
K.Alianne

Jerseyはバグが多いため、Content-Type application/jsonを使用すると、想定どおりにユニコードJSONエンコードを自動的に検出しませんが、サーバーで使用されるランタイムプラットフォームエンコードでリクエスト本体をデシリアライズします。応答本体のシリアル化にも同じことが当てはまります。

クライアントは、UTF-8文字セットを明示的に指定する必要があります。

Content-Type: application/json;charset=utf-8
0