使用 GSON 不解析字段,只保留它与 json 原始字符串
Using GSON do not parse a field, only keep it with the json raw string
在 Java 中使用 GSON 是否有任何注释,我可以在其中指示一个字段,即使它是一个对象,它也应将其保留为原始字符串。 ?
或者实现这一目标的最简单方法是什么?
//This is the original
@SerializedName("perro")
public Perro perro
//This is what I want to achieve
@SerializedName("perro")
public String perro
So the result should be
perro = "{"Users":[{"Name":"firulais","Raza":"beagle"},{"Name":"Spike","Value":"Terrier"}]}"
您应该可以使用 public JsonObject perro;
然后您可以调用 gson.toJson(perro)
来获取 String
值。
基本上,您需要创建一个自定义gson TypeAdapter
class 并自己编写从Object 到String 的转换登录。
然后注释该字段以指示要使用的 TypeAdapter,以便 read/write 使用 gson。
此博客中有更多详细信息 post:Gson TypeAdapter Example
示例:将 class 对象作为原始 JSON 字符串
public class StringTypeAdapter extends TypeAdapter<String> {
@Override
public void write(JsonWriter out, String value) throws IOException {
try {
JSONObject jsonObject = new JSONObject(value);
out.beginObject();
Iterator<String> iterator = jsonObject.keys();
while (iterator.hasNext()) {
String key = iterator.next();
String keyValue = jsonObject.getString(key);
out.name(key).value(keyValue);
}
out.endObject();
} catch (JSONException e) {
e.printStackTrace();
}
}
@Override
public String read(JsonReader in) throws IOException {
in.beginObject();
JSONObject jsonObject = new JSONObject();
while (in.hasNext()) {
final String name = in.nextName();
final String value = in.nextString();
try {
jsonObject.put(name, value);
} catch (JSONException e) {
e.printStackTrace();
}
}
in.endObject();
return jsonObject.toString();
}
}
使用类型适配器:
@JsonAdapter(StringTypeAdapter.class)
private String someClass; // Lazy parsing this json
我发现它起作用的唯一方法是使用
public JsonElement perro;
根据@mrsegev 的回答,这里有一个适用于任意对象的更简单版本(在 Kotlin 中):
class RawJsonAdapter: TypeAdapter<String>() {
override fun write(out: JsonWriter?, value: String?) {
out?.jsonValue(value)
}
override fun read(reader: JsonReader?): String {
return JsonParser().parse(reader).toString()
}
}
这利用了在 https://github.com/google/gson/pull/667
中添加的 JsonWriter#jsonValue()
用法:
@JsonAdapter(RawJsonAdapter::class)
val fieldName: String? = null
在 Java 中使用 GSON 是否有任何注释,我可以在其中指示一个字段,即使它是一个对象,它也应将其保留为原始字符串。 ?
或者实现这一目标的最简单方法是什么?
//This is the original
@SerializedName("perro")
public Perro perro
//This is what I want to achieve
@SerializedName("perro")
public String perro
So the result should be
perro = "{"Users":[{"Name":"firulais","Raza":"beagle"},{"Name":"Spike","Value":"Terrier"}]}"
您应该可以使用 public JsonObject perro;
然后您可以调用 gson.toJson(perro)
来获取 String
值。
基本上,您需要创建一个自定义gson TypeAdapter
class 并自己编写从Object 到String 的转换登录。
然后注释该字段以指示要使用的 TypeAdapter,以便 read/write 使用 gson。
此博客中有更多详细信息 post:Gson TypeAdapter Example
示例:将 class 对象作为原始 JSON 字符串
public class StringTypeAdapter extends TypeAdapter<String> {
@Override
public void write(JsonWriter out, String value) throws IOException {
try {
JSONObject jsonObject = new JSONObject(value);
out.beginObject();
Iterator<String> iterator = jsonObject.keys();
while (iterator.hasNext()) {
String key = iterator.next();
String keyValue = jsonObject.getString(key);
out.name(key).value(keyValue);
}
out.endObject();
} catch (JSONException e) {
e.printStackTrace();
}
}
@Override
public String read(JsonReader in) throws IOException {
in.beginObject();
JSONObject jsonObject = new JSONObject();
while (in.hasNext()) {
final String name = in.nextName();
final String value = in.nextString();
try {
jsonObject.put(name, value);
} catch (JSONException e) {
e.printStackTrace();
}
}
in.endObject();
return jsonObject.toString();
}
}
使用类型适配器:
@JsonAdapter(StringTypeAdapter.class)
private String someClass; // Lazy parsing this json
我发现它起作用的唯一方法是使用
public JsonElement perro;
根据@mrsegev 的回答,这里有一个适用于任意对象的更简单版本(在 Kotlin 中):
class RawJsonAdapter: TypeAdapter<String>() {
override fun write(out: JsonWriter?, value: String?) {
out?.jsonValue(value)
}
override fun read(reader: JsonReader?): String {
return JsonParser().parse(reader).toString()
}
}
这利用了在 https://github.com/google/gson/pull/667
中添加的JsonWriter#jsonValue()
用法:
@JsonAdapter(RawJsonAdapter::class)
val fieldName: String? = null