如何在Gson序列化中保持字段序列

Ser*_*sky 36 java serialization json gson

看起来像Gson.toJson(Object object)生成带有对象随机扩展字段的JSON代码.有办法以某种方式修复字段顺序吗?


    public class Foo {
            public String bar;
            public String baz;

            public Foo( String bar, String baz ) {
                    this.bar = bar;
                    this.baz = baz;
            }
    }

    Gson gson = new Gson();
    String jsonRequest = gson.toJson(new Foo("bar","baz"));

    // jsonRequest now can be { "bar":"bar", "baz":"baz" } (which is correct)
    //             and can be { "baz":"baz", "bar":"bar" } (which is a wrong sequence)

Run Code Online (Sandbox Code Playgroud)

谢谢.

Bal*_*usC 28

您需要创建自定义JSON序列化程序.

例如

public class FooJsonSerializer implements JsonSerializer<Foo> {

    @Override
    public JsonElement serialize(Foo foo, Type type, JsonSerializationContext context) {
        JsonObject object = new JsonObject();
        object.add("bar", context.serialize(foo.getBar());
        object.add("baz", context.serialize(foo.getBaz());
        // ...
        return object;
    }

}
Run Code Online (Sandbox Code Playgroud)

并按如下方式使用:

Gson gson = new GsonBuilder().registerTypeAdapter(Foo.class, new FooJsonSerializer()).create();
String json = gson.toJson(foo);
// ...
Run Code Online (Sandbox Code Playgroud)

这样可以保持序列化程序中指定的顺序.

也可以看看:


Sta*_*Man 20

如果GSON不支持字段顺序的定义,则可以使用其他库.杰克逊允许用@JsonPropertyOrder来定义它.必须指定一个自己的自定义序列化器对我来说似乎是非常多的工作.

是的,我同意根据JSON规范,应用程序不应该期望字段的特定排序.

  • @StaxMan虽然我同意你的生产代码声明,对于单元测试(以及某些集成测试),我认为这是一种编写断言的方便而简单的方法. (2认同)

You*_*Qam 5

实际上 Gson.toJson(Object object) 不会以随机顺序生成字段。结果 json 的顺序取决于字段名称的字面顺序。

我遇到了同样的问题,它是通过类中属性名称的字面顺序解决的。

问题中的示例将始终返回以下 jsonRequest:

{ "bar":"bar", "baz":"baz" }

为了有一个特定的顺序,你应该修改字段的名称,例如:如果你想排baz在第一位,那么来bar

public class Foo {
    public String f1_baz;
    public String f2_bar;

    public Foo ( String f1_baz, String f2_bar ) {
        this.f1_baz = f1_baz;
        this.f2_bar = f2_bar;
    }
}
Run Code Online (Sandbox Code Playgroud)

jsonRequest 将是 { "f1_baz ":"baz", "f2_bar":"bar" }