#java #json #parsing #gson
#java #json #синтаксический анализ #gson
Вопрос:
Я пытаюсь преобразовать свою hashmap в формат JSON pretty для печати.
Я попробовал GSON и полагаю, что есть некоторая проблема с обработкой строки в качестве входных данных внутри карты, есть ли какой-либо другой способ сделать это?
Map<String, String> map = new LinkedHashMap();
Gson gson = new GsonBuilder().enableComplexMapKeySerialization().setPrettyPrinting().create();
map.put("Intro", Map_to_String);
map.put("Output", String_Val);
System.out.println(gson.toJson(map));
Вывод:
{
"Intro": {"No":0,"Cast":2},
"Output": "123"
}
Требуемый вывод:
{
"Intro": {"No":0,"Cast":2},
"Output": "123"
}
Комментарии:
1.
{"Intro": "{"No":0,"Cast":2}","Output": "123"}
— недопустимоJSON
. Вы уверены, что не хотите{"Intro": {"No": 0,"Cast": 2},"Output": "123"}
как в моем ответе?2. Да, извините, я обновлю то же самое.
Ответ №1:
В данном случае вам нужно десериализовать Map_to_String
обратно в object — Map
, а затем снова выполнить сериализацию.
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.reflect.TypeToken;
import java.lang.reflect.Type;
import java.util.LinkedHashMap;
import java.util.Map;
public class GsonApp {
public static void main(String[] args) {
Map<String, Object> map = new LinkedHashMap<>();
Gson gson = new GsonBuilder()
.enableComplexMapKeySerialization()
.setPrettyPrinting()
.create();
String jsonString = "{"No":0,"Cast":2}";
Type mapType = new TypeToken<Map<String, String>>() {}.getType();
map.put("Intro", gson.fromJson(jsonString, mapType));
map.put("Output", "123");
System.out.println(gson.toJson(map));
}
}
С принтами:
{
"Intro": {
"No": "0",
"Cast": "2"
},
"Output": "123"
}
Комментарии:
1. Мои фактические данные также имеют строковые значения (нечисловые) в ключах «No» и «Cast», не могли бы вы сообщить мне, какие изменения требуются в таком случае? Если я изменю TypeToken на <Строка, объект>, то на выходе я получаю преобразование целых чисел в десятичные. Я бы хотел, чтобы выходные данные были в самом строковом формате (без десятичных знаков).
2. @InheritedGeek, в таком случае вам следует использовать
Map<String, String>
type. Она будет автоматически использоватьсяString
для значений.