2016-07-15 17 views
-3

これは複数回尋ねられていますが、すでに利用可能な回答を見て、私の問題を解決してくれました。Retrofit 2を使用してJSONレスポンスからArrayListを取得する

私はレトロフィット2を使用してカスタム・デシリアライザを使用して配列のリストに私のJSONレスポンスを解析しようとしています。しかし、それは私にエラー

com.google.gson.JsonSyntaxExceptionいます:java.lang.IllegalStateException:期待をBEGIN_ARRAYは、しかし、これは私がここで

[ 
    { 
    "category": "Accessories" 
    }, 
    { 
    "category": "Apparel" 
    }, 
    { 
    "category": "Audio CD" 
    }, 
    { 
    "keyword": "Accessories & Supplies" 
    }, 
    { 
    "keyword": "Audio & Video Accessories" 
    }, 
    { 
    "keyword": "Combination Deodorants & Antiperspirants" 
    }, 
    { 
    "_id": "57442700d0fcd01100d45cd8", 
    "prodName": "2015 High-end Case Cover zzzzzzz Animals dobermans nature puppies Samsung Galaxy S7 phone Case 3236386XK945021729S7 Jordan Dowdy's Shop" 
    }, 
    { 
    "_id": "575a95fbb9167e100054f5ab", 
    "prodName": "30 Piece Brand New & Sealed Hard Candy' Cosmetics Makeup Excellent Assorted Mixed Lot" 
    }, 
    { 
    "_id": "57442700d0fcd01100d45cd5", 
    "prodName": "8274363XK945021729I5S New Premium zzzzzzz Animals dobermans nature puppies Skin Case Cover Excellent Fitted For iPhone SE/iPhone 5/5s Gary R. Morones's Shop" 
    }, 
    { 
    "_id": "575a95fbb9167e100054f5b0", 
    "prodName": "ACE Fashion Women Professional 15 Color Makeup Cosmetic Contour Concealer Palette Make Up+Sponge+Concealer Brush" 
    } 
] 

を解析しようとしていますJSONレスポンスカスタムデシリアライザ

されている$

パスでBEGIN_OBJECTました

public static class HomeSearchDeserializer implements JsonDeserializer<ArrayList<HomeSearchItems>> { 
    @Override 
    public ArrayList<HomeSearchItems> deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws Js 

     Log.v("JSON RESPONSE " + String.valueOf(countlog++), String.valueOf(json)); 
     Gson gson = new Gson(); 
     Type listType = new TypeToken<ArrayList<HomeSearchItems>>() { 
     }.getType(); 
     ArrayList<HomeSearchItems> HomeSearchItemsList = new Gson().fromJson(json, listType); 
     final JsonArray jsonArray = json.getAsJsonArray(); 
     for (int i = 0; i < jsonArray.size(); i++) { 
      HomeSearchItems homeSearchItems = new HomeSearchItems(); 
      JsonObject jsonObject = jsonArray.get(i).getAsJsonObject(); 
      if (!jsonObject.get("prodName").isJsonNull()) { 
       homeSearchItems.set_id(jsonObject.get("_id").getAsString()); 
       homeSearchItems.setTitle(jsonObject.get("prodName").getAsString()); 
       homeSearchItems.setType(HomeSearchItems.ItemType.product); 
      } else if (!jsonObject.get("category").isJsonNull()) { 
       homeSearchItems.setTitle(jsonObject.get("category").getAsString()); 
       homeSearchItems.setType(HomeSearchItems.ItemType.category); 
      } else { 
       homeSearchItems.setTitle(jsonObject.get("keyword").getAsString()); 
       homeSearchItems.setType(HomeSearchItems.ItemType.keyword); 
      } 
      HomeSearchItemsList.add(homeSearchItems); 
     } 
     return HomeSearchItemsList; 
    } 
} 
public static GsonConverterFactory HomeSearchGsonConverter() { 
    GsonBuilder gsonBuilder = new GsonBuilder(); 
    // Adding custom deserializers 
    gsonBuilder.registerTypeAdapter(HomeSearchItems.class, new Search.HomeSearchDeserializer()); 
    Gson myGson = gsonBuilder.create(); 
    return GsonConverterFactory.create(myGson); 
} 

これは、これは私がネットワーク呼び出しにHomeSearchItemsListHomeSearchItems

型のArrayListのある

public void callSearch(String query) { 
       //Toast.makeText(getApplicationContext(),query,Toast.LENGTH_SHORT); 
       Log.v("query", query); 


       HttpLoggingInterceptor httpLoggingInterceptor = new HttpLoggingInterceptor(); 
       httpLoggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY); 

       OkHttpClient.Builder httpClient = new OkHttpClient.Builder(); 
       httpClient.addInterceptor(new Interceptor() { 
        @Override 
        public okhttp3.Response intercept(Chain chain) throws IOException { 
         Request original = chain.request(); 

         Request request = original.newBuilder() 
           .header("Content-Type", "application/json") 
           .method(original.method(), original.body()) 
           .build(); 

         return chain.proceed(request); 
        } 
       }); 

       httpClient.addInterceptor(httpLoggingInterceptor); 


       OkHttpClient client = httpClient.build(); 
       Retrofit retrofit = new Retrofit.Builder() 
         .baseUrl(baseURL) 
         .addConverterFactory(HomeSearchGsonConverter()) 
         .client(client) 
         .build(); 

       Search.SearchCalls service = retrofit.create(Search.SearchCalls.class); 
       Call<ArrayList<HomeSearchItems>> HomeSearch = service.HomeSearch("Bearer " +appSettings.getToken(),query); 


       HomeSearch.enqueue(new Callback<ArrayList<HomeSearchItems>>() { 
        @Override 
        public void onResponse(Call<ArrayList<HomeSearchItems>> call, Response<ArrayList<HomeSearchItems>> response) { 
         Log.v("onResponse,Code", String.valueOf(response.code())); 
         if (response.isSuccessful()) { 
          HomeSearchItemsList = response.body(); 
          Log.v("onResponse", "isSuccessful TRUE"); 
         } else { 
          Log.v("onResponse", "isSuccessful FALSE"); 
         } 
        } 

        @Override 
        public void onFailure(Call<ArrayList<HomeSearchItems>> call, Throwable t) { 
         Log.v("onFailure", t.toString()); 
        } 
       }); 

      } 

を作っています機能です改造のためのGETコール

public interface SearchCalls { 
    @GET("/products/search") 
    Call<ArrayList<HomeSearchItems>> HomeSearch(@Header("Authorization") String Token, @Query("queryString") String query); 
} 

です

これはHomeSearchItemsクラス

public class HomeSearchItems { 

    public enum ItemType { 
     product, keyword, category 
    } 

    private String title; 
    private ItemType type; 
    private String _id; 


    public HomeSearchItems() { 

    } 

    public String getTitle() { 
     return title; 
    } 

    public void setTitle(String title) { 
     this.title = title; 
    } 

    public ItemType getType() { 
     return type; 
    } 

    public void setType(ItemType type) { 
     this.type = type; 
    } 

    public String get_id() { 
     return _id; 
    } 

    public void set_id(String _id) { 
     this._id = _id; 
    } 
} 

EDIT 1 スタックトレース

V/query: a 
D/OkHttp: --> GET https://houston.tm.smartfission.com:3030/products/search?queryString=a http/1.1 
D/OkHttp: Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOjE2NCwiZXhwIjoxNDczNjY0Mjg5fQ.ROBvKkoC0Gud4AFghYtUku_OXBRYWjzHeR5Dkhd1mOc 
D/OkHttp: --> END GET 
D/OkHttp: <-- 200 OK https://houston.tm.smartfission.com:3030/products/search?queryString=a (2010ms) 
D/OkHttp: X-Powered-By: Express 
D/OkHttp: Access-Control-Allow-Origin: * 
D/OkHttp: Access-Control-Allow-Methods: GET,PUT,POST,DELETE,PATCH,OPTIONS 
D/OkHttp: Access-Control-Allow-Headers: Content-Type, Authorization, Accept-Encoding, Accept-Language 
D/OkHttp: Content-Type: application/json; charset=utf-8 
D/OkHttp: Content-Length: 891 
D/OkHttp: ETag: W/"37b-Qfnf0ExmUd0oo2dJpmXG2g" 
D/OkHttp: Vary: Accept-Encoding 
D/OkHttp: Date: Fri, 15 Jul 2016 11:02:31 GMT 
D/OkHttp: Connection: keep-alive 
D/OkHttp: [{"category":"Accessories"},{"category":"Apparel"},{"category":"Audio CD"},{"keyword":"Accessories & Supplies"},{"keyword":"Audio & Video Accessories"},{"keyword":"Combination Deodorants & Antiperspirants"},{"_id":"57442700d0fcd01100d45cd8","prodName":"2015 High-end Case Cover zzzzzzz Animals dobermans nature puppies Samsung Galaxy S7 phone Case 3236386XK945021729S7 Jordan Dowdy's Shop"},{"_id":"575a95fbb9167e100054f5ab","prodName":"30 Piece Brand New & Sealed Hard Candy' Cosmetics Makeup Excellent Assorted Mixed Lot"},{"_id":"57442700d0fcd01100d45cd5","prodName":"8274363XK945021729I5S New Premium zzzzzzz Animals dobermans nature puppies Skin Case Cover Excellent Fitted For iPhone SE/iPhone 5/5s Gary R. Morones's Shop"},{"_id":"575a95fbb9167e100054f5b0","prodName":"ACE Fashion Women Professional 15 Color Makeup Cosmetic Contour Concealer Palette Make Up+Sponge+Concealer Brush"}] 
D/OkHttp: <-- END HTTP (891-byte body) 
V/onFailure: com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected BEGIN_ARRAY but was BEGIN_OBJECT at path $ 

EDIT 2

execeptionはこのラインにスローされます:

ArrayList<HomeSearchItems> HomeSearchItemsList = new Gson().fromJson(json, listType); 

ドキュメントは言う、

例外: JsonSyntaxExceptionを - JSONは

+0

完全なスタックトレースを投稿する –

+0

スタックトレースとは何ですか? –

+0

ログcatに表示されるエラー。詳しくは、https://en.wikipediaを参照してください。org/wiki/Stack_trace –

答えて

0

あなたのJSONはあなたの条件に従ってフォーマットされていないtypeOfT型のオブジェクトのための有効な表現ではない場合。

次のようなJSON構造があなたのために働くかもしれない -

[ 
    { 
    "category": "Accessories", 
    "keyword": "Accessories & Supplies", 
    "_id": "57442700d0fcd01100d45cd8", 
    "prodName": "2015 High-end Case Cover zzzzzzz Animals dobermans nature puppies Samsung Galaxy S7 phone Case 3236386XK945021729S7 Jordan Dowdy's Shop" 
    }, 
    { 
    "category": "Apparel", 
    "keyword": "Audio & Video Accessories", 
    "_id": "575a95fbb9167e100054f5ab" 
    "prodName": "30 Piece Brand New & Sealed Hard Candy' Cosmetics Makeup Excellent Assorted Mixed Lot" 
    } 
] 

これは、データモデルのために働くかもしれませんが、あなたがもう一度確認したい場合がありますあなたのデシリアライザでいくつかの野生のものは、そこにあります。

JSONデータの定義方法の詳細については、thisリンクを参照してください。これは確かに役立つでしょう。

+0

私はjsonの応答を制御できません。それを変更できないので、Javaへの応答を解析するにはどうすればよいでしょうか? –

+0

@AsadTariq私は応答フォーマットが間違っていると強く感じています。私はあまりにも進んでいく方法については考えていませんが、この奇妙な対応を担当するサービスチームと話し合うべきだと真剣に考えています。今すぐ整流する方が良いです。 – Manish

+0

バックエンドチームがサーバーとその設定を担当します。彼らはこのサーバーへの呼び出しをうまくやっているiOSアプリ全体を開発しているので、彼らが構造を変更するのは間違いです。私はアプリをAndroidに移植する責任がありますので、私はこの応答にこだわる必要があります。どのような方法であれ、私はこの応答を解析する方法を教えてください。返される 配列は要素 1.私は、リストにそれらのすべてを追加し、ユーザーにリストを表示する必要がカテゴリー 2.キーワード 3.製品 の3つの可能なタイプで構成することができます。 –

関連する問題