Обратная косая черта Escape-строки с использованием GSON

#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 для значений.