0

你好,我有这个跟随 json 代码。

[{"check":{"domain":"qwe.coedu.br"}},{"check":{"domain":"qwe.com.br"}},{"check":{"domain":"qwe.com"}}]"

如何在我的对象中转换这个 json

class Check {String domain , String status ...}

它返回 a List<Check>,但 Check 属性为空。看我的代码。与格森。

Gson gson = new Gson();
    Type fooType = new TypeToken<Collection<Check>>(){}.getType();
    System.out.println(((List<Check>)gson.fromJson("[{\"check\":{\"status\":\"2\",\"domain\":\"william.com.br\"}}]", fooType)).get(0).getDomain());

当我调试返回的列表时,它包含列表中的所有对象,但所有对象的属性都为空。

怎么了 ?

4

2 回答 2

2

您需要一个自定义转换器,因为您有一个包含名为 的属性的对象列表check。该属性属于具有属性domain和的类status

这里有两种可能:

  1. 如果您不想更改 Json 格式,或者您根本无法编写自己的JsonDeserializer,您将在其中实例化您的Check对象,然后自己设置属性是最佳选择;
  2. 或者您可以修改您的检查类以保存check一个类型的属性,该类型包含一个名为的属性domain和另一个属性status

对于第二种情况很清楚需要做什么,但对于第一种情况,您可以执行以下操作:

import java.lang.reflect.Type;
import java.util.Collection;

import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
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.reflect.TypeToken;

public class GsonTestClass {

    static class MyDeserializer implements JsonDeserializer<Check> {

        public Check deserialize(JsonElement arg0, Type arg1,
                JsonDeserializationContext arg2) throws JsonParseException {
            JsonObject jsonObject = arg0.getAsJsonObject().get("check").getAsJsonObject();
            // this code could be improved with null checks and so on...
            return new Check( //
                    jsonObject.get("domain").getAsString(), //
                    jsonObject.get("status").getAsString() //
            );
        }

    }

    public static void main(String args[]) {
        Gson gson = new GsonBuilder().registerTypeAdapter(Check.class, new MyDeserializer()).create();
        String json = "[{\"check\":{\"status\":\"2\",\"domain\":\"william.com.br\"}}]";
        Type fooType = new TypeToken<Collection<Check>>() {}.getType();
        System.out.println((gson.fromJson(json, fooType)));
    }

    static class Check {

        private String domain;
        private String status;

        public Check() {
        }

        public Check(String domain, String status) {
            super();
            this.domain = domain;
            this.status = status;
        }

        public String getDomain() {
            return domain;
        }

        public void setDomain(String domain) {
            this.domain = domain;
        }

        public String getStatus() {
            return status;
        }

        public void setStatus(String status) {
            this.status = status;
        }

        @Override
        public String toString() {
            return "Check: " + domain + " - " + status;
        }

    }

}
于 2012-07-11T12:26:54.423 回答
2

您的 Java 类及其Check字段对应于domainstatus

{"status":"2","domain":"william.com.br"}

在 JSON 中,因此 JSON“等效”List<Check>

[{"status":"1","domain":"qwe.coedu.br"},{"status":"1","domain":"qwe.com.br"}]

您的 JSON 具有另一层对象嵌套,其中每个列表条目都是一个具有一个名为 的属性的对象check。要么重组你的 JSON 以删除看似不必要的嵌套,要么反序列化为例如

List<Map<String,Check>>
于 2012-07-11T12:29:17.647 回答