Use gson instead of json_simple.
Bug: 79692626
Change-Id: Ib265b465bffc58a88a972de69cb71aab8ba19a60
diff --git a/LIBRARY-LICENSE b/LIBRARY-LICENSE
index c19c9c3..12674e3 100644
--- a/LIBRARY-LICENSE
+++ b/LIBRARY-LICENSE
@@ -3,11 +3,11 @@
copyrightHolder: The Guava Authors
license: The Apache Software License, Version 2.0
licenseUrl: http://www.apache.org/licenses/LICENSE-2.0.txt
-- artifact: com.googlecode.json-simple:json-simple:+
- name: JSON.Simple
+- artifact: com.google.code.gson:gson:+
+ name: Gson
license: The Apache Software License, Version 2.0
licenseUrl: http://www.apache.org/licenses/LICENSE-2.0.txt
- url: http://code.google.com/p/json-simple/
+ url: https://github.com/google/gson
- artifact: it.unimi.dsi:fastutil:+
name: fastutil
license: Apache License, Version 2.0
diff --git a/build.gradle b/build.gradle
index 94c002f..6db08fe 100644
--- a/build.gradle
+++ b/build.gradle
@@ -34,7 +34,7 @@
fastutilVersion = '7.2.0'
guavaVersion = '23.0'
joptSimpleVersion = '4.6'
- jsonSimpleVersion = '1.1'
+ gsonVersion = '2.7'
junitVersion = '4.12'
kotlinVersion = '1.2.30'
protobufVersion = '3.0.0'
@@ -205,7 +205,7 @@
dependencies {
compile "net.sf.jopt-simple:jopt-simple:$joptSimpleVersion"
- compile "com.googlecode.json-simple:json-simple:$jsonSimpleVersion"
+ compile "com.google.code.gson:gson:$gsonVersion"
// Include all of guava when compiling the code, but exclude annotations that we don't
// need from the packaging.
compileOnly("com.google.guava:guava:$guavaVersion")
@@ -485,11 +485,11 @@
static configureRelocations(ShadowJar task) {
task.relocate('com.google.common', 'com.android.tools.r8.com.google.common')
+ task.relocate('com.google.gson', 'com.android.tools.r8.com.google.gson')
task.relocate('com.google.thirdparty', 'com.android.tools.r8.com.google.thirdparty')
task.relocate('joptsimple', 'com.android.tools.r8.joptsimple')
task.relocate('org.apache.commons', 'com.android.tools.r8.org.apache.commons')
task.relocate('org.objectweb.asm', 'com.android.tools.r8.org.objectweb.asm')
- task.relocate('org.json.simple', 'com.android.tools.r8.org.json.simple')
task.relocate('it.unimi.dsi.fastutil', 'com.android.tools.r8.it.unimi.dsi.fastutil')
}
diff --git a/src/main/java/com/android/tools/r8/dex/Marker.java b/src/main/java/com/android/tools/r8/dex/Marker.java
index 31628ad..b36f30c 100644
--- a/src/main/java/com/android/tools/r8/dex/Marker.java
+++ b/src/main/java/com/android/tools/r8/dex/Marker.java
@@ -4,11 +4,12 @@
package com.android.tools.r8.dex;
import com.android.tools.r8.graph.DexString;
-import java.util.Map;
-import java.util.TreeMap;
-import org.json.simple.JSONObject;
-import org.json.simple.parser.JSONParser;
-import org.json.simple.parser.ParseException;
+import com.google.gson.JsonElement;
+import com.google.gson.JsonObject;
+import com.google.gson.JsonParser;
+import com.google.gson.JsonSyntaxException;
+import java.util.Comparator;
+import java.util.Map.Entry;
/**
* Abstraction for hidden dex marker intended for the main dex file.
@@ -26,22 +27,17 @@
private static final String D8_PREFIX = PREFIX + Tool.D8 + "{";
private static final String R8_PREFIX = PREFIX + Tool.R8 + "{";
- private final TreeMap<String, Object> content;
+ private final JsonObject jsonObject;
private final Tool tool;
public Marker(Tool tool) {
this.tool = tool;
- this.content = new TreeMap<>();
+ jsonObject = new JsonObject();
}
- private Marker(Tool tool, JSONObject object) {
+ private Marker(Tool tool, JsonObject jsonObject) {
this.tool = tool;
- content = new TreeMap<>();
- // This loop is necessary to make the type checker to shut up.
- for (Object e : object.entrySet()) {
- Map.Entry<?,?> entry = (Map.Entry<?,?>) e;
- content.put(String.valueOf(entry.getKey()), entry.getValue());
- }
+ this.jsonObject = jsonObject;
}
public Tool getTool() {
@@ -57,70 +53,58 @@
}
public String getVersion() {
- return (String) content.get(VERSION);
+ return jsonObject.get(VERSION).getAsString();
}
public Marker setVersion(String version) {
- internalPut(VERSION, version);
+ assert !jsonObject.has(VERSION);
+ jsonObject.addProperty(VERSION, version);
return this;
}
public Long getMinApi() {
- return (Long) content.get(MIN_API);
+ return jsonObject.get(MIN_API).getAsLong();
}
public Marker setMinApi(long minApi) {
- internalPut(MIN_API, minApi);
+ assert !jsonObject.has(MIN_API);
+ jsonObject.addProperty(MIN_API, minApi);
return this;
}
public String getSha1() {
- return (String) content.get(SHA1);
+ return jsonObject.get(SHA1).getAsString();
}
public Marker setSha1(String sha1) {
- internalPut(SHA1, sha1);
- return this;
- }
-
- private Marker internalPut(String key, Object value) {
- assert (key != null) && (value != null);
- assert !content.containsKey(key);
- content.put(key, value);
+ assert !jsonObject.has(SHA1);
+ jsonObject.addProperty(SHA1, sha1);
return this;
}
@Override
public String toString() {
- // The JSONObject does not support a predictable sorted serialization of the object.
- // Therefore, a TreeMap is used and iteration is over the keySet.
- StringBuffer sb = new StringBuffer(PREFIX + tool);
- boolean first = true;
- sb.append('{');
- for (String key : content.keySet()) {
- if (first) {
- first = false;
- } else {
- sb.append(',');
- }
- sb.append(JSONObject.toString(key, content.get(key)));
- }
- sb.append('}');
- return sb.toString();
+ // In order to make printing of markers deterministic we sort the entries by key.
+ final JsonObject sortedJson = new JsonObject();
+ jsonObject.entrySet()
+ .stream()
+ .sorted(Comparator.comparing(Entry::getKey))
+ .forEach(entry -> sortedJson.add(entry.getKey(), entry.getValue()));
+ return PREFIX + tool + sortedJson;
}
@Override
public boolean equals(Object obj) {
if (obj instanceof Marker) {
Marker other = (Marker) obj;
- return (tool == other.tool) && content.equals(other.content);
+ return (tool == other.tool) && jsonObject.equals(other.jsonObject);
}
return false;
}
@Override
public int hashCode() {
- return tool.hashCode() + 3 * content.hashCode();
+ return tool.hashCode() + 3 * jsonObject.hashCode();
}
// Try to parse str as a marker.
@@ -142,11 +126,11 @@
private static Marker internalParse(Tool tool, String str) {
try {
- Object result = new JSONParser().parse(str);
- if (result instanceof JSONObject) {
- return new Marker(tool, (JSONObject) result);
+ JsonElement result = new JsonParser().parse(str);
+ if (result.isJsonObject()) {
+ return new Marker(tool, result.getAsJsonObject());
}
- } catch (ParseException e) {
+ } catch (JsonSyntaxException e) {
// Fall through.
}
return null;