- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
不知何故,从一个应用程序发布到另一个,org.json 库的内部结构崩溃了。它无法再将键的内容作为字符串读取。下面是一个代码示例,该代码在启用 minify/R8/proguard 时可以正常工作并且会中断。
try {
parseJson("{\"rewards\":[{\"amount\":1,\"name\":\"Add Audio\"}]}");
} catch (Exception e) {
Log.w("TEST", "Error parsing rewarded currencies JSON header!!!", e);
}
private void parseJson(@NonNull String rewardedCurrencies) throws JSONException {
final Map<String, String> rewardsMap = jsonStringToMap(rewardedCurrencies);
for (Map.Entry<String, String> entry : rewardsMap.entrySet()) {
Log.e("TEST", entry.getKey() + ":" + entry.getValue());
}
}
public Map<String, String> jsonStringToMap(String jsonParams) throws JSONException {
Map<String, String> jsonMap = new HashMap<String, String>();
if (TextUtils.isEmpty(jsonParams)) return jsonMap;
JSONObject jsonObject = (JSONObject) new JSONTokener(jsonParams).nextValue();
Iterator<String> keys = jsonObject.keys();
Log.e("TEST", "jsonStringToMap() -> jsonObject: "+jsonObject.toString());
while (keys.hasNext()) {
String key = (String) keys.next();
Log.e("TEST", "jsonStringToMap() -> key: "+key);
jsonMap.put(key, jsonObject.getString(key));
}
return jsonMap;
}
日志输出失败:
jsonStringToMap() -> jsonObject: {"rewards":[{"amount":1,"name":"Add Audio"}]}
jsonStringToMap() -> key: rewards
Error parsing rewarded currencies JSON header!!!
j.b.b: JSONObject["rewards"] not a string.
at j.b.d.getString(SourceFile:4)
那么,自上次可用的应用程序发布以来,该项目发生了什么变化?
targetSdkVersion 28 -> 29
sourceCompatibility JavaVersion.VERSION_1_7 -> JavaVersion.VERSION_1_8
'com.android.tools.build:gradle:4.0.0' -> 'com.android.tools.build:gradle:4.1.1'
distributionUrl ->gradle-6.1.1-all.zip -> gradle-6.5-all.zip
-keep class org.json.** { *; }
最佳答案
我能在错误日志中找到异常文本的唯一引用来自这里:JSONObject not a String Error
我无法从 Android org.json 实现中找到会导致该异常的代码路径。这意味着 org.json
以某种方式打包到您的应用程序中。这也意味着它不是您担心的标准库问题。
进一步强调这一点:https://github.com/stleary/JSON-java/blob/master/src/main/java/org/json/JSONObject.java#L849-L864
这完全解释了您的问题。 JSONObject#getString(String key)
的实现与 Android 实现不同。您只能通过这种方式读取对象的字符串值。任何其他值都将被拒绝并导致异常。由于您正在阅读 JSONArray
这是行不通的。
无论您使用的是 Android 标准库还是拉取的依赖项,我下面的示例都将解决此问题。
没有 ProGuard 也能工作的原因是系统已经提供了 Androids org.json。缩小时,它将重命名依赖项 org.json 包,从而强制您使用它。
我建议摆脱 org.json
依赖性。或者编写适用于两者的代码...您可能想切换到 Gson
或 Jackson
无论如何,因为它更容易使用。
public static Map<String, String> jsonStringToMap(String jsonParams) throws JSONException {
Map<String, String> jsonMap = new HashMap<>();
if (TextUtils.isEmpty(jsonParams)) return jsonMap;
// Use JSONObject constructor
JSONObject jsonObject = new JSONObject(jsonParams);
Iterator<String> keys = jsonObject.keys();
Log.e("TEST", "jsonStringToMap() -> jsonObject: " + jsonObject.toString());
while (keys.hasNext()) {
String key = keys.next();
Log.e("TEST", "jsonStringToMap() -> key: " + key);
// Type safe way to get the String value of any type within the key
// Probably needs to handle null values correctly
jsonMap.put(key, String.valueOf(jsonObject.get(key)));
}
return jsonMap;
}
关于android - 为什么缩小会导致错误 "JSONObject["奖励“] 不是字符串”?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65077282/
我喜欢我正在设计的网站的徽章和成就的概念。它们已被证明可以提高使用率/利用率,我认为这可能是我想要开发的应用程序的一大动力。 在高层次上,我可以想到 3 种方法来做到这一点。 检查满足作为 cron
我正在用ARKit做一些实验,并试图在iPhone 5S中运行,只是想看看会发生什么: 我在Xcode 9.0 beta 6中收到此错误: “ARDemo”需要iPhone不支持的“ARKit”功能
我们在 OptaPlanner 的 XML 文件中为类(class)问题添加负软约束,例如 0 但是
不知何故,从一个应用程序发布到另一个,org.json 库的内部结构崩溃了。它无法再将键的内容作为字符串读取。下面是一个代码示例,该代码在启用 minify/R8/proguard 时可以正常工作并且
我们有一个场景,我们希望允许用户将图像上传到网站。我们在 ASP.Net 上运行。 快速搜索并没有找到任何好的结果。如果该控件是免费/开源的,那就太好了,但我们不介意支付一点费用。 最佳答案 我强烈推
我正在尝试使用 Electron 框架在 macOS 上创建通知。我已经从 GitHub 克隆了开源快速入门,我的 renderer.js 进程中的唯一代码如下: var myNoti
我想知道 Google Pay 如何在“您的奖励”页面的 GridView 中显示不同类型的卡片。我正在尝试开发像 Google Pay 这样的卡 最佳答案 有许多库可用于开发 Google Pay
我觉得是时候从Webforms升级到MVC了。我已经编写了Webforms和jquery很长时间了。 你们都可以建议您喜欢的资源来学习这项技术吗? 奖励:我对使用ViewModel(不一定是MVVM框
我是一名优秀的程序员,十分优秀!