2016-08-19 1 views
0

Mein Server sendet die Daten wie folgt. Ich benutze Gson, um diese Daten zu analysieren. Aber es ist mit folgenden Ausnahme versagt:Gson Antwort Parsing mit doppelten Anführungszeichen im Array

{ 
    "users":[ 
     { 
     "config":{ 
     "identifiers":{ 
      "id":"7" 
     }, 
     "v_id":[ 
      "335", 
      "Product User " 
     ], 
     "m_id":[ 
      "3530", 
      "4744" 
     ], 
     "expand":{ 
      "chategory":[ 
       { 
       "identifiers":{ 
        "id":"3" 
       }, 
       "catConfig":{ 
        "security":"Private" 
       } 
       } 
      ], 
      "hobby":[ 
       { 
       "identifiers":{ 
        "id":"200", 
        "d_id":[ 
         "Playing \"Football\"", 
         "Music", 
         "Dancing", 
         "Browsing" 
        ] 
       }, 
       "type":"Output" 
       } 
      ] 
     } 
    } 
    } 
    ] 
} 

Exception

org.json.JSONException: Unterminated array at character 183 of "chategory":[{"identifiers":{"id":"3"},"catConfig":{"security":"Private"}}],"hobby":[{"identifiers":{"id":"200","d_id":["Playing"Football"","Music","Dancing","Browsing"]},"type":"Output"}]}, 
at org.json.JSONTokener.syntaxError(JSONTokener.java:450) 
at org.json.JSONTokener.readArray(JSONTokener.java:440) 
at org.json.JSONTokener.nextValue(JSONTokener.java:103) 
at org.json.JSONTokener.readObject(JSONTokener.java:385) 
at org.json.JSONTokener.nextValue(JSONTokener.java:100) 
at org.json.JSONTokener.readObject(JSONTokener.java:385) 
at org.json.JSONTokener.nextValue(JSONTokener.java:100) 
at org.json.JSONTokener.readArray(JSONTokener.java:430) 
at org.json.JSONTokener.nextValue(JSONTokener.java:103) 
at org.json.JSONTokener.readObject(JSONTokener.java:385) 
at org.json.JSONTokener.nextValue(JSONTokener.java:100) 
at org.json.JSONObject.<init>(JSONObject.java:156) 
at org.json.JSONObject.<init>(JSONObject.java:173) 
at honeywell.security.isom.customformatter.ExpansionJsonConverter.convertJsonStringIntoHashMap(ExpansionJsonConverter.java:80) 
at honeywell.security.isom.customformatter.ExpansionJsonConverter.read(ExpansionJsonConverter.java:64) 
at honeywell.security.isom.customformatter.ExpansionJsonConverter.read(ExpansionJsonConverter.java:22) 
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.read(ReflectiveTypeAdapterFactory.java:118) 
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:253) 
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.read(ReflectiveTypeAdapterFactory.java:118) 
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:253) 
at com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.read(TypeAdapterRuntimeTypeWrapper.java:41) 
at com.google.gson.internal.bind.CollectionTypeAdapterFactory$Adapter.read(CollectionTypeAdapterFactory.java:82) 
at com.google.gson.internal.bind.CollectionTypeAdapterFactory$Adapter.read(CollectionTypeAdapterFactory.java:61) 
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.read(ReflectiveTypeAdapterFactory.java:118) 
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:253) 
at com.google.gson.Gson.fromJson(Gson.java:981) 
at honeywell.security.isom.client.proxybase.BaseControllerProxy.deserializeTheResponse(BaseControllerProxy.java:554) 
at honeywell.security.isom.client.proxybase.BaseControllerProxy.excuteRequest(BaseControllerProxy.java:321) 
at honeywell.security.isom.client.proxybase.BaseControllerProxy.prepareDetailsToSendRequest(BaseControllerProxy.java:421) 
at honeywell.security.isom.client.proxybase.BaseControllerProxy.executeGETMethod(BaseControllerProxy.java:123) 
at honeywell.security.isom.client.proxycontroller.PeripheralsControllerProxy.getperipheralentitylist(PeripheralsControllerProxy.java:44) 
at com.mpcthreadlib.request.RequestISOM.getISOMRequest(RequestISOM.java:557) 
at com.mpcthreadlib.manage.RequestThread.executeRequest(RequestThread.java:102) 
at com.mpcthreadlib.manage.RequestThread.run(RequestThread.java:71) 
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112) 
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587) 

HINWEIS Die Eingabe mit Escape-Sequenz war, wo, wie die Gson beschwerte Schnur nicht tut, hat. Wenn es ein normales JsonObject anstelle von JsonArray ist, funktioniert es gut.

Was könnte das Problem sein?

+1

Bitte setzen Java Bean-Klasse für Gson – Palak

+0

@Palak macht das wirklich nötig? Deserialisierung aufgrund doppelten Anführungszeichens. –

+0

@Palak, die gleiche Antwort funktioniert, wenn es kein Anführungszeichen enthält. –

Antwort

0

extrahiert ich den Teil des json

{"d_id":["Playing \"Football\"","Music","Dancing","Browsing"]} 

Ich habe versucht, Ihre json in die Pojo Klasse zu kopieren und erzeugt die folgende Klasse

public class Bean { 
    private String[] d_id; 
    public String[] getD_id() { 
     return d_id; 
    } 
    public void setD_id(String[] d_id) { 
     this.d_id = d_id; 
    } 
    @Override 
    public String toString() { 
     return "ClassPojo [d_id = " + d_id + "]"; 
    } 
} 

RetrofitUtil

public class UtilRetrofit { 
    public static String URL = ""; 
    private static ENDPointerListener sENDPointerListener; 
    public static ENDPointerListener getENDPointerListener() { 
     if (sENDPointerListener == null) { 
      sENDPointerListener = new ENDPointerListener() { 
       @Override 
       public String getEndPoint() { 
        return URL; 
       } 
      }; 
     } 
     return sENDPointerListener; 
    } 
    public static void setENDPointerListener(ENDPointerListener pENDPointerListener) { 
     sENDPointerListener = pENDPointerListener; 
    } 
    public interface ENDPointerListener { 
     String getEndPoint(); 
    } 
    public static <T> T build(Class<T> t) { 
     OkHttpClient okhttp = new OkHttpClient.Builder().addInterceptor(new StethoInterceptor()).build(); 
     Retrofit retrofit = new Retrofit.Builder().client(okhttp) 
       .baseUrl(getENDPointerListener().getEndPoint()) 
       .addConverterFactory(GsonConverterFactory.create(new GsonBuilder() 
         .setDateFormat("yyyy-MM-dd'T'HH:mm:ssZ") 
         .create())) 
       .build(); 
     return retrofit.create(t); 
    } 
} 

und Verwendung Nachrüstung und Mock-Server zum Abrufen des Werts

@Override 
    public void onViewCreated(View view, Bundle savedInstanceState) { 
     super.onViewCreated(view, savedInstanceState); 
     RestA rest = UtilRetrofit.build(RestA.class); 
     Call<Bean> call = rest.geBean(); 
     call.enqueue(new Callback<Bean>() { 
      @Override 
      public void onResponse(Call<Bean> call, Response<Bean> response) { 
       Bean data =response.body(); 
      } 
      @Override 
      public void onFailure(Call<Bean> call, Throwable t) { 
       Toast.makeText(getActivity(),t.toString(),Toast.LENGTH_SHORT).show(); 
      } 
     }); 
    } 

Mein Ergebnis ist in Ordnung, auch wenn es doppelte Anführungszeichen in der Zeichenfolge gibt. Hat es in Ihrer Bean-Klasse ein Problem?

@RunWith(AndroidJUnit4.class) 
@SmallTest 
public class RestATest { 
    @Rule 
    public ActivityTestRule<MainActivity> mMainActivityActivityTestRule = new ActivityTestRule<MainActivity>(MainActivity.class, true, false); 
    private MockWebServer mMock; 
    @Before 
    public void set() { 
     mMock = new MockWebServer(); 
     try { 
      mMock.play(); 
     } catch (IOException pE) { 
      pE.printStackTrace(); 
     } 
     //set the mock Server 
     UtilRetrofit.URL = mMock.getUrl("/").toString(); 
    } 
    @Test 
    public void testRequest1() { 
     String bodyStr = "{\"d_id\":[\n\"Playing \\\"Football\\\"\",\n\"Music\",\n\"Dancing\",\n\"Browsing\"\n]\n}"; 
     mMock.enqueue(new MockResponse().setResponseCode(200).setBody(bodyStr)); 
     mMainActivityActivityTestRule.launchActivity(null); 
    } 


} 
+0

Es sollte nicht Long, da es funktioniert gut, wenn die gleiche Antwort hat kein Anführungszeichen. –

+0

Möchten Sie dieses versuchen, um Ihre aktuelle Sub-Bean zu ersetzen? Ich frage mich, ob es den gleichen Fehler erzeugt –

0

Ich habe dies mit GSON Standard Deserializer versucht und es funktioniert gut. Ich hatte keine Ausnahme.

private void parseJSON() { 
    String json = "{\"users\":[{\"config\":{\"identifiers\":{\"id\":\"7\"},\"v_id\":[\"335\",\"Product User \"],\"m_id\":[\"3530\",\"4744\"],\"expand\":{\"chategory\":[{\"identifiers\":{\"id\":\"3\"},\"catConfig\":{\"security\":\"Private\"}}],\"hobby\":[{\"identifiers\":{\"id\":\"200\",\"d_id\":[\"Playing \\\"Football\\\"\",\"Music\",\"Dancing\",\"Browsing\"]},\"type\":\"Output\"}]}}}]}"; 

    Gson gson = new Gson(); 
    JSONResponse jsonResponse = gson.fromJson(json, JSONResponse.class); 

    for (String s : jsonResponse.getUsers().get(0).getConfig().getExpand().getHobby().get(0).getIdentifiers().getDId()) { 
     System.out.println(s); 
    } 

} 

Ausgang:

08-19 12:26:49.682 12405-12405/com.trial.mobileapps.gsontrial I/System.out: Playing "Football" 
08-19 12:26:49.682 12405-12405/com.trial.mobileapps.gsontrial I/System.out: Music 
08-19 12:26:49.682 12405-12405/com.trial.mobileapps.gsontrial I/System.out: Dancing 
08-19 12:26:49.682 12405-12405/com.trial.mobileapps.gsontrial I/System.out: Browsing 

Gson Abhängigkeit

compile 'com.google.code.gson:gson:2.7' 
Verwandte Themen