【问题标题】:Coverting json array using retrofit?使用改造转换 json 数组?
【发布时间】:2015-05-24 01:06:12
【问题描述】:

这是我的 Json

[  
{  
  "nata_center":{  
     "id":67,
     "nata_center_name":"Primo Institute of Design"
  }
 },
{  
  "nata_center":{  
     "id":68,
     "nata_center_name":"Sai Ganesh Institute"
  }
 }
]

Pojo 课程

public class Explorer {
    NataCenter nataCenter;

    public NataCenter getNataCenter() {
        return nataCenter;
    }

    public void setNataCenter(NataCenter nataCenter) {
        this.nataCenter = nataCenter;
    }
}

2)

public class NataCenter {
    public String id;
    public String nata_center_name;

     public NataCenter(String id,String nata_center_name)
     {
      this.id=id;
     this.nata_center_name=nata_center_name;
     }

    public void setId(String id) {
        this.id = id;
    }

    public String getId() {
        return id;
    }

    public String getNata_center_name() {
        return nata_center_name;
    }

    public void setNata_center_name(String nata_center_name) {
        this.nata_center_name = nata_center_name;
    }
}

GetMethhodinRetrofit

void getCenter(@Query("id") int id,Callback<List<Explorer>> callback);

MainActvitiy.java

       service.getCenter(i,new Callback<List<Explorer>>() {
                        @Override
                        public void success(List<Explorer> o, Response response) {
                            Log.d(TAG,"Success" + "Response"+o.toString());

                        @Override
                        public void failure(RetrofitError error) {
                            Log.d(TAG,"Failed"+error.toString());

                        }
                    });

这是错误信息

 Failedretrofit.RetrofitError: com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected BEGIN_ARRAY but was BEGIN_OBJECT at line 1 column 2 path $

【问题讨论】:

  • 你能在 json 中改变一些东西吗?
  • 你确定json有问题吗?
  • 对我来说没有 :) 但如果你再添加一个标签会更轻松
  • 我可以修改 json 还是你想要 json 看起来像你的?
  • @KonradKrakowiak 是的,但如果我添加它会起作用吗?

标签: java android json gson retrofit


【解决方案1】:

基本上问题是您在 json 中有数组作为根。您必须创建将用作此列表的容器和此对象的反序列化器的对象。我使用 Explorer 作为容器,如下所示:

public class Explorer {

    List<NataCenter> nataCenter;


    public List<NataCenter> getNataCenter() {
        return nataCenter;
    }

    public void add(NataCenter nataCenterItem){
        if(nataCenter == null){
            nataCenter = new LinkedList<>();
        }
        nataCenter.add(nataCenterItem);
    }
}

我的解决方案只是解释。您可以改进您的Explorer 课程。列表的二传手不是最好的主意。

NataCenter 类看起来像以前的,

重要的想法之一是ExplorerDeserializerJson 类。它用于反序列化json,如下所示:

public class ExplorerDeserializerJson implements JsonDeserializer<Explorer> {

    @Override
    public Explorer deserialize(JsonElement je, Type type, JsonDeserializationContext jdc)
            throws JsonParseException {
        Explorer explorer = new Explorer();
        JsonArray jsonArray = je.getAsJsonArray();
        Gson gson = new Gson();
        for(JsonElement element : jsonArray){
            JsonObject jsonObject = element.getAsJsonObject();
            NataCenter nataCenter = gson.fromJson(jsonObject.get("nata_center"), NataCenter.class);
            explorer.add(nataCenter);
        }
        return explorer;

    }
}

另外我改变了你的客户。现在Explorer 是一个响应。

void getCenter(@Query("id") int id,Callback<Explorer> callback);

最后你必须在你创建 RestAdapter 的地方注册新的反序列化器,如下所示:

 RestAdapter restAdapter = new RestAdapter.Builder()
                   .setEndpoint(BuildConfig.IP)
                    .setConverter(new GsonConverter(new GsonBuilder()
                            .registerTypeAdapter(Explorer.class, new ExplorerDeserializerJson())
                            .create()))
                    .build();
            restAdapter.create(CenterClient.class).getCenter(1);

【讨论】:

  • 我会检查并告诉你
  • @当我尝试 Log.d(TAG,o.getNataCenter().get(0).getNata_center_name());像这样的东西。
  • o 是什么?它是哪个类实例?
  • o 是资源管理器变量
  • @非常感谢。我会检查
猜你喜欢
  • 2019-02-17
  • 2015-11-16
  • 2017-05-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-27
相关资源
最近更新 更多