gpt4 book ai didi

android - 为什么缩小会导致错误 "JSONObject["奖励“] 不是字符串”?

转载 作者:行者123 更新时间:2023-12-04 08:29:48 26 4
gpt4 key购买 nike

不知何故,从一个应用程序发布到另一个,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


修复方法是在 proguard 脚本中应用一个新行。

-keep class org.json.** { *; }


现在我很担心。为什么我需要将此应用于 proguard?是否有其他内部库可能会损坏?我似乎无法弄清楚是什么导致了这种情况,这是否是一个潜在的大问题?

最佳答案

我能在错误日志中找到异常文本的唯一引用来自这里: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依赖性。或者编写适用于两者的代码...您可能想切换到 GsonJackson无论如何,因为它更容易使用。

    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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com