1

不确定是否已经回答了这个问题,但是快速搜索并没有得到令人满意的结果。
我遇到了以下情况:

  • 具有 REST API 和 JSON 格式数据块的 Web 服务
  • android 客户端应用程序与此服务通信并在本地缓存/处理数据

we 服务由一家德国公司运营,因此结果数据中的某些字符串包含特殊字符,例如德语变音符号:

// example resonse
[
    {
         "title" : "reward 1",
         "description" : "Ein gro\u00dfer Kaffee f\u00fcr dich!"
    },
    {
         "title" : "reward 2",
         "description" : "Eine Pizza f\u00fcr dich!"
    },
    ...
]

在本地,应用程序使用一组反映响应对象的类(例如,上例的RewardRewardResponse类)来解析数据。这些类中的每一个都可以从/到 JSON 读取和转储自身 - 然而这就是事情变得丑陋的地方。

以上面的例子为例,org.json 将正确解析数据,生成的字符串将包含特殊字符 'ß' ( \u00df ) 和 'ü' ( \u00fc ) 的正确 Unicode 版本。

final RewardResponse response = new RewardResponse(jsonData);
final Reward reward = response.get(0);

// this will print "Ein großer Kaffee für dich!"
Log.d("dump server data", reward.getDescription());

final Reward reward2 = new Reward(reward.toJSON());

// this will print "Ein gro�er Kaffee f�r dich!"
Log.d("dump reloaded data", reward2.getDescription());

如您所见,加载JSONObject.toString()生成的数据时存在问题。
主要发生的事情是JSONObject将以“\uXXXX”的形式解析转义,但它会将它们转储为纯 UTF-8 文本。

反过来,在解析时,它不会正确读取 unicode,而是在结果字符串中插入替换字符(在\uffff上方作为代码点)。

我当前的解决方法包括一个查找表,其中包含 Unicode Latin1 补充字符及其各自的转义版本(\u00a0\u00ff)。但这也意味着我必须检查每一个转储的 JSON 文本,并在每次转储某些内容时用转义版本替换字符。

请告诉我有更好的方法!

(注意:有这个问题,但是他在磁盘上的本地文件编码有问题。
如您所见,我上面的问题是可以重现的,而无需写入磁盘)

编辑:根据评论中的要求,这里是toJSON()方法:

public final String toJSON() {
    JSONObject obj = new JSONObject();

    // mTitle and mDescription contain the unmodified
    // strings received from parsing.
    obj.put("title", mTitle);
    obj.put("description", mDescription);

    return obj.toString();
}

作为旁注,如果我使用JSONObject.toString()JSONStringer没有区别。(文档建议使用.toString()

编辑:只是为了从等式中删除奖励,这会重现问题:

final JSONObject inputData = new JSONObject("{\"description\":\"Ein gro\\u00dfer Kaffee\"}");
final JSONObject parsedData = new JSONObject(inputData.toString());

Log.d("inputData", inputData.getString("description"));
Log.d("parsedData", parsedData.getString("description"));
4

1 回答 1

0

[注意:作为更好格式的答案发布]

我刚刚尝试了这个例子

final JSONObject inputData = new JSONObject("{\"description\":\"Ein gro\\u00dfer Kaffee\"}");
final JSONObject parsedData = new JSONObject(inputData.toString());

Log.d("inputData", inputData.getString("description"));
Log.d("parsedData", parsedData.getString("description"));

在我运行 Android 4.2.1 的 Nexus 7 和运行 4.1.2 的 Nexus S 上,它按预期工作:

D/inputData(17281): Ein großer Kaffee
D/parsedData(17281): Ein großer Kaffee

您在哪个 Android 版本中发现了问题?

于 2013-01-11T13:16:11.630 回答