我想使用GSON将下面的Example类序列化为JSON。
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import java.util.LinkedHashMap;
public class Example
{
private LinkedHashMap<String,Object> General;
private static final String VERSION="Version";
private static final String RANGE="Range";
private static final String START_TIME="Start_Time";
private static final String END_TIME="End_Time";
public Example() {
General = new LinkedHashMap<String,Object>();
General.put(VERSION, "0.1");
LinkedHashMap<String,String> Range = new LinkedHashMap<String, String>();
Range.put(START_TIME, "now");
Range.put(END_TIME, "never");
General.put(RANGE, Range);
}
public String toJSON() {
Gson gson = new GsonBuilder().serializeNulls().create();
return gson.toJson(this);
}
}
我期望得到以下输出:
{"General":{"Version":"0.1","Range":{"Start_Time":"now","End_Time":"never"}}}
但是调用函数toJSON()
返回
{"General":{"Version":"0.1","Range":{}}}
看来GSON无法在Map Range
内序列化Map General
。这是GSON的限制,还是我在这里做错了?
Nishant的答案之所以起作用,是因为Gson的默认构造函数默认启用所有类型的东西,否则您将不得不使用GsonBuilder手动启用它们。
从JavaDocs:
使用默认配置构造一个Gson对象。默认配置具有以下设置:
* toJson方法生成的JSON以紧凑形式表示。这意味着将删除所有不需要的空格。您可以使用GsonBuilder.setPrettyPrinting()更改此行为。
* 生成的JSON会忽略所有为空的字段。请注意,由于数组是有序列表,因此数组中的null保持原样。此外,如果字段不为null,但其生成的JSON为空,则保留该字段。您可以通过设置GsonBuilder.serializeNulls()将Gson配置为序列化空值。
* Gson为Enums,Map,java.net.URL,java.net.URI,java.util.Locale,java.util.Date,java.math.BigDecimal和java.math.BigInteger类提供了默认的序列化和反序列化。如果您希望更改默认表示,则可以通过GsonBuilder.registerTypeAdapter(Type,Object)注册类型适配器来进行更改。
* 默认的日期格式与java.text.DateFormat.DEFAULT相同。此格式在序列化过程中忽略日期的毫秒部分。您可以通过调用GsonBuilder.setDateFormat(int)或GsonBuilder.setDateFormat(String)来更改此设置。
* 默认情况下,Gson会忽略com.google.gson.annotations.Expose注释。您可以通过GsonBuilder.excludeFieldsWithoutExposeAnnotation()启用Gson仅序列化/反序列化带有此批注的字段。
* 默认情况下,Gson会忽略com.google.gson.annotations.Since注释。您可以通过GsonBuilder.setVersion(double)使Gson使用此注释。
* 输出Json的默认字段命名策略与Java中的相同。因此,Java类字段versionNumber将在Json中输出为“
versionNumber
@”。相同的规则也适用于将传入的Json映射到Java类。您可以通过GsonBuilder.setFieldNamingPolicy(FieldNamingPolicy)更改此策略。
* 默认情况下,Gson在进行序列化和反序列化时不考虑瞬态或静态字段。您可以通过GsonBuilder.excludeFieldsWithModifiers(int)更改此行为。
好,现在我明白了问题所在。如您所料,默认的Map序列化器不支持嵌套映射。如您从DefaultTypeAdapters的此源代码片段中看到的(尤其是如果您使用调试器逐步调试),由于某种神秘的原因,变量childGenericType
被设置为类型java.lang.Object
,因此永远不会分析该值的运行时类型。
我猜有两种解决方案:
public String toJSON(){
final Gson gson = new Gson();
final JsonElement jsonTree = gson.toJsonTree(General, Map.class);
final JsonObject jsonObject = new JsonObject();
jsonObject.add("General", jsonTree);
return jsonObject.toString();
}
问题内容: 我想使用GSON将下面的Example类序列化为JSON。 我期望得到以下输出: 但是调用函数返回 看来GSON无法在Map 内序列化Map 。这是GSON的限制,还是我在这里做错了? 问题答案: Nishant的答案之所以起作用,是因为Gson的默认构造函数默认启用了所有东西,否则您将不得不使用GsonBuilder手动启用它们。 从JavaDocs: 使用默认配置构造一个Gson对
问题内容: 如何将作为地图的属性序列化为地图的值列表?我已经能够使用吸气剂上的注释进行其他简单的转换。但是,我不确定我想做什么。 问题答案: 我们需要类似的东西,在我们的案例中,我们使用了您所评论的自定义项,这很简单: 使用它的代码:
问题内容: 我的直觉告诉我,必须以某种方式将其转换为字符串或byte [](在Go中甚至可能是相同的东西?),然后将其保存到磁盘。 我找到了这个包(http://golang.org/pkg/encoding/gob/),但似乎仅用于结构? 问题答案: 序列化数据有多种方法,Go为此提供了许多软件包。某些常见编码方式的软件包: 处理地图很好。以下示例显示了地图的编码/解码: 操场
问题内容: 我有一个使用字符串作为键和值的映射。我有一个键数组,用于指定地图值的顺序。 我想将该映射序列化为JSON,但要保持数组上定义的顺序。 这里有一个示例代码:http : //play.golang.org/p/A52GTDY6Wx 我想将其序列化为: 但是,如果我直接序列化地图,则密钥按字母顺序排列: 我可以将其序列化为地图数组,从而保持顺序,但是会生成很多不需要的字符: 在我的真实代码
我有一个具有两个属性的JSON对象:“key”(字符串)和“value”(可以反序列化为Java bean)。 问题是,给定一个这样的物体列表,我能把它反序列化为一张地图吗? 当前使用Jackson-databind 2.1
我们正在项目中使用mapstruct。虽然它适用于dto到域对象(比如EmployeeDTO到EmployeedData,具有类似属性)的总和,但我们需要处理传入的json字符串。我们正试图编写一个非常通用的映射程序,将传入的json字符串映射到java对象。 假设我们有这样的员工 {id: 1, name="xxx"}但它是以字符串形式出现的,因此我有一个mapstruct映射器 它工作不正常,