当前位置: 首页 > 知识库问答 >
问题:

JSON Jackson HTTPClient与德国umlauts

赫连俊雄
2023-03-14

关于json字符串,我遇到了一个问题,我是通过Apache http客户端获得的,它包含德国的UMLAUT。

json字符串的映射仅在字符串不包含任何德语umlaut的情况下有效,否则我会得到一个“JsonMappingException:无法反序列化[…]的实例”超出起始数组。

ApacheHTTP客户端将“Accept Charset”设置为http。UTF-8,但结果我总是得到例如“\u00fc”而不是“u”。当我手动将例如“\u00fc”替换为“u”时,映射效果非常好。

我如何从Apache超文本传输协议客户端获得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代码的字符串类型。

更新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,有关umlauts的问题已经解决了!此外,GSON似乎真的比Jackson Json更快。

解决方法是手动替换下表中的字符:

Sign        Unicode representation

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

共有1个答案

姬朗
2023-03-14

尝试这样解析:

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

没有理由通过String,Jackson直接解析InputStreams。如果您使用我提出的方法,Jackson也会自动检测编码。

编辑顺便考虑使用GSON JSON解析库。它甚至比Jackson更快,更易于使用。然而,Jackson最近也开始解析XMl,这是一种美德。

EDIT2在您添加了所有细节之后,我想问题在于服务的服务器实现——UMLAUT在json中不是unicode转义的——UTF 8是它的本机编码。为什么不通过正则表达式手动替换例如“\u00fc”为“u”呢?

 类似资料:
  • 我使用以下命令为德语语言模型提供corenlp服务器,这些模型在类路径中作为jar下载,但它不输出德语标记或解析,只加载英语模型: German.Prop内容:

  • 问题内容: 无论用户身在何处和当前设备时间如何,如何获取德国的当前时间? 问题答案: 如我在这里建议的那样,改用android.text.format.Time。 每当有人建议Calender在Android上使用时,我都会爬出我的小地方,并告诉他们请改用android.text.format.Time,因为它非常适合日常使用。更轻巧,达到实际需求。 有关格式,请参见http://linux.di

  • 问题内容: 我从包含德国变音符号的数据库中获取数据时遇到麻烦。基本上,每当我收到包含变音符号的数据时,它都是带有问号的黑色正方形。我通过把 查询之前。 问题是,一旦我对查询结果使用,则包含umlaut的值会得到。我可以通过直接在浏览器中调用php文件来看到这一点。除了在编码为JSON并将其解码为JS之前替换此字符之外,还有其他解决方案吗? 问题答案: 您可能只想以某种方式在浏览器中显示文本,因此一

  • 用熊猫打开德国csv文件的最佳方式是什么? 我有一个包含以下列的德语csv文件: 基准:格式为“DD.MM”的日期。YYYY' Umlaute:带有德语特有字符的德语名称 扎伦:格式为“000.000,00”的数字 我的预期产出是: 下面提供了示例数据(见文件)。 这将引发一个: 这不会引发错误,但与我期望的输出相差甚远: 日期是字符串,而不是日期时间 现在,我有四行代码,但仍然不起作用。最后一行

  • 我注意到在JavaFX1.x中,脚本语言允许非常简单的字符串国际化。JavaFX2中有类似的特性吗? 基本上:国际化JavaFX2应用程序的最佳实践是什么?

  • 一面 自我介绍,介绍项目,有什么意义,有什么难点,遇到什么困难,怎么解决,为什么想来我们公司,家是哪的