Propper如何处理android上包含特殊字符的JSON数据的转储和重新加载?

Propper如何处理android上包含特殊字符的JSON数据的转储和重新加载?,android,json,encoding,unicode-escapes,Android,Json,Encoding,Unicode Escapes,不确定是否已经回答了这个问题,但快速搜索并没有得到令人满意的结果。。 我被以下情况困住了: 带有RESTAPI和JSON格式数据blob的web服务 android客户端应用程序与此服务对话并在本地缓存/处理数据 we服务由一家德国公司运行,因此结果数据中的一些字符串包含特殊字符,如德语umlauts: 在本地,应用程序使用一组反映响应对象的类解析数据,例如上面示例中的奖励和奖励响应类。这些类中的每一个都可以从/到JSON读取和转储自身-但是这就是问题的症结所在 以上面的示例为例,org.js

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

带有RESTAPI和JSON格式数据blob的web服务 android客户端应用程序与此服务对话并在本地缓存/处理数据 we服务由一家德国公司运行,因此结果数据中的一些字符串包含特殊字符,如德语umlauts:

在本地,应用程序使用一组反映响应对象的类解析数据,例如上面示例中的奖励和奖励响应类。这些类中的每一个都可以从/到JSON读取和转储自身-但是这就是问题的症结所在

以上面的示例为例,org.json将正确解析数据,结果字符串将包含特殊字符“ß”\u00df和“ü”\u00fc的正确Unicode版本

最终报酬响应=新报酬响应JSONDATA; 最终奖励=response.get0; //这将打印Ein großer Kaffee für dich! Log.ddump服务器数据,reward.getDescription; 最终报酬报酬2=新报酬报酬报酬.toJSON; //这将打印Ein gro�埃尔卡菲f�r迪奇! Log.ddump重新加载的数据,reward2.getDescription; 如您所见,加载由JSONObject.toString生成的数据时存在问题。 主要发生的是JSONObject将解析\uxxx形式的转义,但它会将它们作为纯UTF-8文本转储

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

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

请告诉我有更好的方法

注意:不过,他在磁盘上的本地文件编码方面有问题。 正如您所看到的,我上面的问题是不需要写入磁盘就可以重现的

编辑:根据注释中的要求,这里是toJSON方法:

作为补充说明,使用JSONObject.toString或jsonString没有什么区别。 文档建议使用.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"));

[注:作为答案发布,以获得更好的格式]

我只是试过这个例子

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版本中发现了问题?

显示toJSON功能。尽管您的直觉不正确,但java字符串中没有UTF-8,它们只是字符串。Java字符串的内部编码是实现细节,这无关紧要,但也不是UTF-8。如果没有发生字节转换,我无法解释这一点。另一种可能是.d用于编写文件的编码日志在日志之间发生了更改。但是从JSON到JSON的转换不应该导致这种情况,因为它总是处理纯字符串。@Esailija我添加了函数,是的,只有字符串-但是org.JSON.JSONObject将转储UTF-8但不会重新解析它的语句仍然有效。上面的Log.d只是一个例子。如果我使用两个文本视图并将response.getDescription和response2.getDescription分配给它们,则有些是正确的。如果只有字符串,则没有UTF-8。但是请打印reward.toJSON,如果它看起来正确,那么您需要显示reward构造函数。。。非常基本的调试,我们可能正在聊天..inputData是错误的,它不能解释java编译器在程序运行之前已经将\u00df转换为字符的事实。因此,应该使用新的JSONObject{\description\:\Ein gro\\u00dfer Kaffee\}测试它@Esailija很好,但结果仍然是一样的,它是有效的。这就是我想的,请参阅问题注释中的讨论。我将把这作为一个有效的答案,因为在清除应用程序的缓存后,我也无法复制它。一定是一些旧代码的残余,这些代码在打包传递数据时进行了一些混搭。
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"));
D/inputData(17281): Ein großer Kaffee
D/parsedData(17281): Ein großer Kaffee