На самом деле, вы должны ожидать, что Node:WithData
сериализуется как
{
"text": "Hello",
"map": {
"to": "the world"
}
}
(это с включенным "симпатичным принтом")
Мне удалось получить эту сериализацию, когда я попробовал ваш пример. Вот мой точный код
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import java.net.MalformedURLException;
import java.util.HashMap;
import java.util.Map;
public class Class1 {
public static void main(String[] args) throws MalformedURLException {
GsonBuilder gb = new GsonBuilder();
Gson g = gb.setPrettyPrinting().create();
Node n = new Node();
n.setText("Hello");
n.setData("to", "the world");
System.out.println(g.toJson(n));
}
private static class WithData {
private Map<String, Object> map = new HashMap<String, Object>();
public void setData(String key, Object value) { map.put(key, value); }
public Object getData(String key) { return map.get(key); }
}
private static class Node extends WithData {
private String text;
public Node() { }
public String getText() {return text;}
public void setText(String text) {this.text = text;}
}
}
Я использовал JDK (javac) для компиляции - это важно, потому что другие компиляторы (включенные в некоторые IDE) могут удалять информацию, на которую опирается Gson, как часть процесса оптимизации или обфускации.
Вот команды компиляции и выполнения, которые я использовал:
"C: \ Program Files \ Java \ jdk1.6.0_24 \ bin \ javac.exe" -classpath gson-2.0.jar Class1.java
"C: \ Program Files \ Java \ jdk1.6.0_24 \ bin \ java.exe" -classpath.; Gson-2.0.jar Class1
Для целей этого теста я поместил файл Gson jar в ту же папку, что и файл класса теста.
Обратите внимание, что я использую Gson 2.0; 1.x может вести себя по-разному.
Ваш JDK может быть установлен в другом месте, чем у меня, поэтому, если вы используете эти команды, обязательно измените путь к вашему JDK соответствующим образом.