0

こんにちは私はこれをjsonコードに従ってもらいました。

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

私のオブジェクトでこのjsonを変換する方法

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

を返しList<Check>ますが、Check属性はnullです。私のコードを参照してください。Gsonと。

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());

返されたリストをデバッグすると、リスト内のすべてのオブジェクトが含まれますが、すべての属性がnullになります。

なにが問題ですか ?

4

2 に答える 2

2

。という名前のプロパティを保持するオブジェクトのリストがあるため、カスタマイズされたコンバーターが必要ですcheckdomainそして、このプロパティは、プロパティと。を持つクラスのものstatusです。

ここで2つの可能性:

  1. Json形式を変更したくない場合、または単に独自の形式を記述できないJsonDeserializer場合は、Checkオブジェクトをインスタンス化してから、独自にプロパティを設定するのが最善の選択です。
  2. または、名前付きのプロパティと別のプロパティを保持するタイプのプロパティを保持するために、チェッククラスを変更することもできます。checkdomainstatus

2番目のケースでは、何をする必要があるかはかなり明確ですが、最初のケースでは、次のようなことを行うことができます。

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

Checkそのフィールドdomainstatusに対応するJavaクラス

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

JSONでは、の「同等の」JSONList<Check>

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

JSONには別のレベルのオブジェクトネストがあり、各リストエントリは。という名前の1つのプロパティを持つオブジェクトcheckです。JSONを再構築して、一見不要なネストを削除するか、たとえばに逆シリアル化します。

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