Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/325.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java gson在json中反序列化相同的键和不同的值_Java_Json - Fatal编程技术网

Java gson在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" ] }, {

这是我的json事件

{  
  "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
}