首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >处理在android上包含特殊字符的JSON数据的转储和重新加载的启动方式?

处理在android上包含特殊字符的JSON数据的转储和重新加载的启动方式?
EN

Stack Overflow用户
提问于 2013-01-11 08:31:40
回答 1查看 977关注 0票数 1

不确定这个问题是否已经得到了答复,但是快速搜索并没有得到令人满意的结果。

我被困在下面的场景中:

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

we服务由一家德国公司运行,因此结果数据中的一些字符串包含特殊字符,如德语umlauts:

代码语言:javascript
复制
// example resonse
[
    {
         "title" : "reward 1",
         "description" : "Ein gro\u00dfer Kaffee f\u00fcr dich!"
    },
    {
         "title" : "reward 2",
         "description" : "Eine Pizza f\u00fcr dich!"
    },
    ...
]

在本地,应用程序使用一组反映响应对象的类来解析数据(例如,奖励类和RewardResponse类,用于上面的示例)。这些类中的每一个都可以从/转到JSON中读取和转储自己--但是这是事情变得糟糕的地方。

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

代码语言:javascript
复制
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文本时,我都必须检查每一个JSON文本,并在每次转储时用它们的转义版本替换字符。

,请告诉我,有更好的方法!

(注意:有this question,但是他在磁盘上的本地文件编码方面有问题。)

我上面的问题,如你所见,是可以复制的,不需要写到磁盘上)

编辑:,如注释中所请求的,下面是toJSON()方法:

代码语言:javascript
复制
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())

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

代码语言:javascript
复制
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"));
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-01-11 13:16:11

注意:张贴是为了更好的格式化

我刚试过这个例子

代码语言:javascript
复制
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"));

在我的Nexus 7上运行Android 4.2.1,在Nexus S上运行4.1.2,它的工作原理如下:

代码语言:javascript
复制
D/inputData(17281): Ein großer Kaffee
D/parsedData(17281): Ein großer Kaffee

你在哪个Android版本中看到了这个问题?

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14274303

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档