gpt4 book ai didi

java - Gson - 一个字段的两个 json 键

转载 作者:行者123 更新时间:2023-11-30 04:12:15 28 4
gpt4 key购买 nike

我阅读了 Gson 文档并决定使用它。但我不知道如何为一个字段使用两个不同的 JSON 键。例如,我有:

public class Box {

@SerializedName("w")
private int width;

@SerializedName("h")
private int height;

@SerializedName("d")
private int depth;

}

对于字段 width,我想使用键 w 或替代键 width 反序列化它,如果在 JSON 中找不到第一个键字符串。

例如,{"width":3, "h":4, "d":2}{"w":3, "h":4, "d":2} 应该可以解析为 Box 类。

如何使用注释或使用 TypedAdapter 来完成此操作?

最佳答案

一种解决方案可能是编写一个 TypeAdapter,如下所示:

package stackoverflow.questions.q19332412;

import java.io.IOException;

import com.google.gson.TypeAdapter;
import com.google.gson.stream.*;

public class BoxAdapter extends TypeAdapter<Box>
{

@Override
public void write(JsonWriter out, Box box) throws IOException {
out.beginObject();
out.name("w");
out.value(box.width);
out.name("d");
out.value(box.depth);
out.name("h");
out.value(box.height);
out.endObject();
}

@Override
public Box read(JsonReader in) throws IOException {
if (in.peek() == JsonToken.NULL) {
in.nextNull();
return null;
}

in.beginObject();
Box box = new Box();
while (in.peek() == JsonToken.NAME){
String str = in.nextName();
fillField(in, box, str);
}

in.endObject();
return box;
}

private void fillField(JsonReader in, Box box, String str)
throws IOException {
switch(str){
case "w":
case "width":
box.width = in.nextInt();
break;
case "h":
case "height":
box.height = in.nextInt();
break;
case "d":
case "depth":
box.depth = in.nextInt();
break;
}
}
}

注意将BoxBoxAdapter放在同一个包中。我将 Box 字段的可见性更改为可见的包,以避免使用 getter/setter。但如果您愿意,也可以使用 getter/setter。

这是调用代码:

package stackoverflow.questions.q19332412;

import com.google.gson.*;

public class Q19332412 {

/**
* @param args
*/
public static void main(String[] args) {
String j1 = "{\"width\":4, \"height\":5, \"depth\"=1}";
String j2 = "{\"w\":4, \"h\":5, \"d\"=1}";

GsonBuilder gb = new GsonBuilder().registerTypeAdapter(Box.class, new BoxAdapter());
Gson g = gb.create();
System.out.println(g.fromJson(j1, Box.class));
System.out.println(g.fromJson(j2, Box.class));
}

}

这是结果:

Box [width=4, height=5, depth=1]

Box [width=4, height=5, depth=1]

关于java - Gson - 一个字段的两个 json 键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19332412/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com