String jsonString = "{\"Apple\":{"
+ "\"cost\":\"0\"},"
+ "\"Pen\":{"
+ "\"cost\":\"0\"}}";
Ich möchte die folgenden zwei Punkte ansprechen.
Dieses Mal werde ich die folgende Bibliothek zum Bedienen des typischen (?) Json verwenden.
Android Studio: 3.4.1 gradle: 5.1.1
Beschreiben der Bibliothek, die im Abhängigkeitsblock von build.gradle hinzugefügt werden soll.
dependencies {
...
implementation 'com.google.code.gson:gson:2.8.5'
implementation 'com.fasterxml.jackson.core:jackson-databind:2.9.8'
implementation 'org.glassfish:javax.json:1.1.4'
}
Gson
Verwenden Sie die erstellte Methode (editJson), um eine Json-Zeichenfolge zu erstellen
Ersetzt durch Map <String, MAP <String, String >>
(Gson.fromJson) und weist den gewünschten Schlüssel und Wert zu.
Nach der Ersetzung wird die Map wieder in eine Json-Zeichenfolge (Gson.toJson) konvertiert.
Obwohl es vom Hauptthema abweicht, Konvertiere [Json => andere Klasse] in "Deserialization", Die Konvertierung von [other class => Json] heißt "Serialization".
import com.google.gson.Gson;
...
public class GsonExample {
String jsonString = "{\"Apple\":{" +
"\"cost\":\"0\"}," +
"\"Pen\":{" +
"\"cost\":\"0\"}}";
public void main() {
editJson("Apple", "100");
/*
{
"Apple": {
"cost": "100"
},
"Pen": {"
"cost": "0"
}
}"
*/
editJson("ApplePen", "");
/*
{
"Apple": {
"cost": "100"
},
"Pen": {"
"cost": "0"
}
"ApplePen": {"
"cost": "0"
}
}"
*/
}
private void editJson(String key, String str) {
if (str.isEmpty()) str = "0";
Map<String, String> innerMap = new HashMap<>();
innerMap.put("cost", str);
Gson gson = new Gson();
//Konvertieren Sie die Json-Zeichenfolge in Map
Map<String, Map<String,String>> jsonMap = gson.fromJson(jsonString, Map.class);
jsonMap.put(key, innerMap);
//Konvertieren Sie Map erneut in Json-Zeichenfolge
jsonString = gson.toJson(jsonMap);
}
}
Jackson Der Austauschvorgang erfolgt fast genauso wie bei Gson. Jackson übersetzt Json über die ObjectMapper-Methode.
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
...
public class JacksonExample {
// main()Wurde weggelassen
private void editJson(String str, String key) {
if (str.isEmpty()) str = "0";
Map<String, Object> map = null;
Map<String, String> innerMap = new HashMap<>();
innerMap.put("cost", str);
ObjectMapper mapper = new ObjectMapper();
try {
//Konvertieren Sie die Json-Zeichenfolge in Map
map = mapper.readValue(json,
new TypeReference<Map<String, Object>>() {});
} catch (IOException e) {
e.printStackTrace();
}
map.put(key, innerMap);
try {
//Konvertieren Sie Map erneut in Json-Zeichenfolge
json = mapper.writeValueAsString(map);
} catch (JsonProcessingException e) {
e.printStackTrace();
}
}
}
Ich habe versucht, eine ähnliche Implementierung mit der Bibliothek javax.json zu implementieren, bin aber festgefahren.
Ich habe festgestellt, dass Sie "org.json.JSONObject" verwenden können, wenn Sie nur Json in Map konvertieren und Werte hinzufügen möchten.
import org.json.JSONException;
import org.json.JSONObject;
...
public class JSONExample {
// main()Wurde weggelassen
private void editJson(String str, String key) {
if (str.isEmpty()) str = "0";
Map<String, String> innerMap = new HashMap<>();
innerMap.put("cost", str);
try {
JSONObject jsonObject = new JSONObject(json);
jsonObject.put(key, new JSONObject(innerMap));
json = jsonObject.toString();
} catch (JSONException e) {
e.printStackTrace();
}
}
}
Ich habe auf den folgenden Artikel verwiesen.