2

json 文字列に関して問題があります。ドイツ語のウムラウトを含む Apache http クライアントで取得しています。

json 文字列のマッピングは、文字列にドイツ語のウムラウトが含まれていない場合にのみ機能します。

Apache http クライアントは「Accept-Charset」を HTTP.UTF-8 に設定されていますが、その結果、「ü」ではなく「\u00fc」が常に取得されます。たとえば「\u00fc」を「ü」に手動で置き換えると、マッピングは完璧に機能します。

Apache http クライアントから utf-8 でエンコードされた json 応答を取得するにはどうすればよいですか? または、サーバー出力に問題がありますか?

params.setParameter(HttpProtocolParams.USE_EXPECT_CONTINUE, false);
HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1);
HttpProtocolParams.setContentCharset(params, HTTP.UTF_8);
httpclient = new DefaultHttpClient(params);
httpclient = new DefaultHttpClient(params);
HttpGet httpGetContentLoad = new HttpGet(url);
httpGetContentLoad.setHeader("Accept-Charset", "utf-8");
httpGetContentLoad.setParams(params);
response = httpclient.execute(httpGetContentLoad);
entity = response.getEntity();
String loadedContent = null;
if (entity != null)
{
   loadedContent = EntityUtils.toString(entity, HTTP.UTF_8);
   entity.consumeContent();
}
if (HttpStatus.SC_OK != response.getStatusLine().getStatusCode())
{
    throw new Exception("Loading content failed");
}
closeConnection();
return loadedContent;

json コードは次のようにマップされます。

String jsonMetaData = loadGetRequestContent(getLatestEditionUrl(newspaperEdition));
Newspaper loadedNewspaper = mapper.readValue(jsonMetaData, Newspaper.class);
loadedNewspaper.setEdition(newspaperEdition);

更新 1: JsonMetaData は、フェッチされた json コードを含む String 型です。

アップデート2:

json出力を変換するために使用するこのコードには、次のものが必要です。

public static String convertJsonLatestEditionMeta(String jsonCode)
{
    jsonCode = jsonCode.replaceFirst("\\[\"[A-Za-z0-9-[:blank:]]+\",\\{", "{\"edition\":\"an-a1\",");
    jsonCode = jsonCode.replaceFirst("\"pages\":\\{", "\"pages\":\\[");
    jsonCode = Helper.replaceLast(jsonCode, "}}}]", "}]}");
    jsonCode = jsonCode.replaceAll("\"[\\d]*\"\\:\\{\"", "\\{\"");
    return jsonCode;
}

Update3: JSON 変換例:

変換前のjsoncode:

["Newspaper title",
{
    "date":"20130103",
"pages":
            {
            "1":  {"ressort":"ressorttitle1","pdfpfad":"pathToPdf1","number":1,"size":281506},
            "2":{"ressort":"ressorttitle2","pdfpfad":"pathToPdf2","number":2,"size":281533},
            [...]
        }
    }
]

変換後の Jsoncode:

{   
"edition":"Newspaper title",
"date":"20130103",
    "pages":
    [
       {"ressort":"Resorttitle1","pdfpfad":"pathToPdf1","number":1,"size":281506},
       {"ressort":"Resorttitle2","pdfpfad":"pathToPdf2","number":2,"size":281533},
       [...]
    ]
}

解決策: @Borisが提案したようにGSONの使用を開始し、ウムラウトに関する問題はなくなりました! さらに、GSON は実際には Jackson Json よりも速いようです。

回避策は、この表に従って文字を手動で置き換えることです。

Sign        Unicode representation

Ä, ä        \u00c4, \u00e4
Ö, ö        \u00d6, \u00f6
Ü, ü        \u00dc, \u00fc
ß           \u00df
€           \u20ac
4

1 に答える 1

2

次のように解析してみてください。

entity = response.getEntity();
Newspaper loadedNewspaper=mapper.readValue(entity.getContent(), Newspaper.class);

通過する理由はありませんString、ジャクソンはInputStreamsを直接解析します。また、私の提案したアプローチを使用すると、Jacksonはエンコーディングを自動的に検出します。

編集ちなみに、GSONJSON解析ライブラリの使用を検討してください。ジャクソンよりもさらに高速で使いやすいです。ただし、Jacksonは最近XMlの解析も開始しました。これは、長所です。

EDIT2結局のところ、詳細として追加したので、問題はサービスのサーバー実装にあると思います-umlautsはjsonでUnicodeエスケープされるべきではありません-UTF8はそのネイティブエンコーディングです。manually replace e.g. "\u00fc" with "ü"正規表現を介して行う代わりに、なぜあなたはそれをしませんか?

于 2013-01-10T09:28:35.177 に答える