java - JSON Jackson + HTTPClient 带有德语变音符号

标签 java android json httpclient

我遇到了有关 json 字符串的问题,我使用 Apache http 客户端获取该字符串,其中包含德语变音符号。

只有当字符串不包含任何德语变音符号时,json 字符串的映射才有效,否则我会收到“JsonMappingException:无法从 START_ARRAY 中反序列化 [...] 的实例。

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;
}

更新3: 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

最佳答案

尝试这样解析:

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

没有理由经过String , jackson 解析InputStream直接。如果您使用我建议的方法,Jackson 也会自动检测编码。

编辑顺便考虑使用 GSON JSON 解析库。它甚至比 Jackson 更快并且更易于使用。不过,Jackson 最近也开始解析 XMl,这是一个优点。

EDIT2 在您添加了详细信息之后,我认为问题出在服务的服务器实现上 - 变音符号不会在 json 中进行 unicode 转义 - UTF 8 是 native 编码它。你为什么不代替 manually replace e.g. "\u00fc" with "ü"通过正则表达式来做吗?

关于java - JSON Jackson + HTTPClient 带有德语变音符号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14248787/

相关文章:

java - 损坏的 Eclipse 项目 - classNotFoundException - 找不到主类

java - 为什么 Java Graphics2D 'drawString' 停止 repaint()?

java - 将字符串转换为 ASCII 以及将 ASCII 转换为字符串

android - PlatformException(错误,java.lang.IllegalStateException : Trying to create a platform view of unregistered type: plugins. flutter.io/webview

Android如何根据第一个标签输入更新第二个标签?

android - 为什么使用 Graph API 获取 FB 头像需要访问 token ?

java - sohronit如何将pdf文件中的byte字节[]分页并恢复回来

javascript - JSON.parse — "unexpected token"构造的 JSON 字符串

JSON 对象解析但省略了集合中的第一项

json - AngularJS、JSON 和 js 限制。如何使用 $http.get 和 "file:///"URI 从外部读取 JSON 文件?