Java gson在json中反序列化相同的键和不同的值
这是我的json事件Java gson在json中反序列化相同的键和不同的值,java,json,Java,Json,这是我的json事件 { "type":"record", "name":"Doc", "doc":"adoc", "fields":[ { "name":"id", "type":"string" }, { "name":"user_friends_count", "type":[ "int", "null" ] }, {
{
"type":"record",
"name":"Doc",
"doc":"adoc",
"fields":[
{
"name":"id",
"type":"string"
},
{
"name":"user_friends_count",
"type":[
"int",
"null"
]
},
{
"name":"user_location",
"type":[
"string",
"null"
]
}}
我试图反序列化它的事件,但坚持使用相同的“type”
不同的值,例如一个“type”
使用“string”
值,另一个使用[“string”,“null”]
如何迭代它们??这是我的密码
import java.lang.reflect.Type;
import java.util.ArrayList;
import com.google.gson.JsonArray;
import com.google.gson.JsonDeserializationContext;
import com.google.gson.JsonDeserializer;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.google.gson.JsonParseException;
import com.google.gson.JsonPrimitive;
public class FieldaDeserialisation implements JsonDeserializer<Fields>{
public Fields deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context)
throws JsonParseException {
JsonObject jobj = json.getAsJsonObject();
JsonArray A1 = jobj.get("fields").getAsJsonArray();
JsonPrimitive jtype = null;
String jname = null;
for (int i = 0; i < jobj.size(); i++) {
JsonElement obj = A1.get(i);
JsonObject b1 = obj.getAsJsonObject();
jname = b1.get("name").getAsString();
if (b1.get("type").isJsonArray()) {
JsonArray jarray = b1.get("type").getAsJsonArray();
for (int j = 0; j < jarray.size(); j++) {
jtype = (JsonPrimitive) jarray.get(j);
}
}
else {
jtype = (JsonPrimitive) b1.get("type");
}
}
}
这是我的主要反序列化类
import java.lang.reflect.Type;
import com.google.gson.JsonArray;
import com.google.gson.JsonDeserializationContext;
import com.google.gson.JsonDeserializer;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.google.gson.JsonParseException;
public class JsonDataDeserialisation implements JsonDeserializer<JsonData>{
@Override
public JsonData deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context)
throws JsonParseException {
// TODO Auto-generated method stub
JsonObject jobj = json.getAsJsonObject();
String jsontype = jobj.get("type").getAsString();
String jsonname = jobj.get("name").getAsString();
String jsondoc = jobj.get("doc").getAsString();
Fields[] fields = context.deserialize(jobj.get("fields"), Fields[].class);
JsonData jdata = new JsonData();
jdata.setType(jsontype);
jdata.setName(jsonname);
jdata.setDoc(jsondoc);
jdata.setFields(fields);
return jdata;
}
}
这是我以前做的一个错误
Exception in thread "main" com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: This is not a JSON Array.
at com.google.gson.Gson.fromJson(Gson.java:899)
at com.google.gson.Gson.fromJson(Gson.java:952)
at com.google.gson.internal.bind.TreeTypeAdapter$GsonContextImpl.deserialize(TreeTypeAdapter.java:162)
at JsonDataDeserialisation.deserialize(JsonDataDeserialisation.java:20)
at JsonDataDeserialisation.deserialize(JsonDataDeserialisation.java:1)
at com.google.gson.internal.bind.TreeTypeAdapter.read(TreeTypeAdapter.java:69)
at com.google.gson.Gson.fromJson(Gson.java:887)
at JsonMainClass.main(JsonMainClass.java:15)
Caused by: java.lang.IllegalStateException: This is not a JSON Array.
at com.google.gson.JsonElement.getAsJsonArray(JsonElement.java:106)
at FieldaDeserialisation.deserialize(FieldaDeserialisation.java:18)
at FieldaDeserialisation.deserialize(FieldaDeserialisation.java:1)
at com.google.gson.internal.bind.TreeTypeAdapter.read(TreeTypeAdapter.java:69)
at com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.read(TypeAdapterRuntimeTypeWrapper.java:41)
at com.google.gson.internal.bind.ArrayTypeAdapter.read(ArrayTypeAdapter.java:72)
at com.google.gson.Gson.fromJson(Gson.java:887)
... 7 more
召唤
Fields[] fields = context.deserialize(jobj.get("fields"), Fields[].class);
您已经从这里接收到了数组,只需将json解析为一个数组,然后进行迭代
JsonArray A1 = json.getAsJsonArray();
然后,您可以使用type
type类型上的条件,像看起来那样进行迭代
为了更简洁,我将使用JsonElement
来存储字段
JsonElement type = b1.get("type");
if(type.isJsonArray()){
JsonArray array = type.getAsJsonArray();
...//ARRAY
else {
String s = type.getAsString();
...//STRING
}
使用
getAsJsonArray()
无法获取值这只是一个强制转换当前实例的方法(基本上)。您需要将字段
对象作为数组获取。然后使用一个条件来检查typeno am passing fields对象,fields是我的类,带有name和type变量,fields[]fields是rootfields类中的我的var是我用main类和反序列化类编辑我的问题请注意,如果有语法错误,我无法测试代码,也无法访问文档,请通知我或欢迎您编辑语法代码;-)我将代码改为jobj.getAsJsonArray(“字段”)代码>我在FieldadeSerialization.deserialize(fieldadeSerialization.java:18)的FieldadeSerialization.Deserialization(fieldadeSerialization.java:1)的com.google.gson.internal.bind.TreeTypeAdapter.read(TreeTypeAdapter.java:69)的线程“main”java.lang.NullPointerException中得到了这个错误在com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.read(TypeAdapterRuntimeTypeWrapper.java:41)
@raghu的哪一行?你能用这个stacktrace编辑你的问题吗?这会更容易;)@raghu,我猜你已经将数组传递给这个方法了。。。事实上,我说错了,你需要获取字段
,你可以做json.getAsJsonArray()
@raghu-edited,你已经在这里收到了数组(没有提到,抱歉(
JsonArray A1 = json.getAsJsonArray();
JsonElement type = b1.get("type");
if(type.isJsonArray()){
JsonArray array = type.getAsJsonArray();
...//ARRAY
else {
String s = type.getAsString();
...//STRING
}