Hello. I am trying to connect to the Yandex translator API.
When converting response using gson in the string:
mapGetResponse = gson.fromJson(response.body().toString(), Map.class); Gives an error message:
com.google.gson.JsonSyntaxException:
com.google.gson.stream.MalformedJsonException:
Unterminated array at line 1 column 35 path $. [1]
And this happens only if the translation is returned from more than one word. If you translate only one word, then everything is fine.
MainActivity
public class MainActivity extends AppCompatActivity { public final String URL = "https://translate.yandex.net"; public final String KEY = "trnsl.1.1.20160324T093729Z.b14b7c54accb1f8e.7d811d65e5f9b19b5541568a35af1e6c8019b10e"; private TextView tvTranslate; private EditText etInputText; private Gson gson; private Retrofit retrofit; private YandexTranslateService service; private Map<String, String> mapJson, mapGetResponse; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); tvTranslate = (TextView) findViewById(R.id.tvTranslate); etInputText = (EditText) findViewById(R.id.etInputText); gson = new GsonBuilder().create(); retrofit = new Retrofit.Builder() .addConverterFactory(GsonConverterFactory.create(gson)) .baseUrl(URL) .build(); service = retrofit.create(YandexTranslateService.class); } public void onClickTranslate(View view) { mapJson = new HashMap<>(); mapJson.put("key", KEY); mapJson.put("text", etInputText.getText().toString()); mapJson.put("lang", "en-ru"); ResponseTask responseTask = new ResponseTask(); responseTask.execute(); try { Response<Object> response = responseTask.get(); System.out.println(response.body()); mapGetResponse = gson.fromJson(response.body().toString(), Map.class); System.out.println(mapGetResponse); } catch (InterruptedException e) { e.printStackTrace(); } catch (ExecutionException e) { e.printStackTrace(); } for (Map.Entry e: mapGetResponse.entrySet()){ if (e.getKey().equals("text")) { tvTranslate.setText(e.getValue().toString()); } } } public void onClickClear(View view){ tvTranslate.setText(""); etInputText.setText(""); } class ResponseTask extends AsyncTask<Void, Void, Response<Object>>{ Response<Object> response; @Override protected Response<Object> doInBackground(Void... params) { Call<Object> call = service.translate(mapJson); try { response = call.execute(); } catch (IOException e) { e.printStackTrace(); } return response; } } } YandexTranslateService
public interface YandexTranslateService { @FormUrlEncoded @POST("/api/v1.5/tr.json/translate") Call<Object> translate(@FieldMap Map<String, String> map); } Error code
03-25 06:33:05.026 19719-19719/com.gotb.testretrofit E/AndroidRuntime: FATAL EXCEPTION: main java.lang.IllegalStateException: Could not execute method for android:onClick at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:293) at android.view.View.performClick(View.java:4204) at android.view.View$PerformClick.run(View.java:17355) at android.os.Handler.handleCallback(Handler.java:725) at android.os.Handler.dispatchMessage(Handler.java:92) at android.os.Looper.loop(Looper.java:137) at android.app.ActivityThread.main(ActivityThread.java:5041) at java.lang.reflect.Method.invokeNative(Native Method) at java.lang.reflect.Method.invoke(Method.java:511) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560) at dalvik.system.NativeStart.main(Native Method) Caused by: java.lang.reflect.InvocationTargetException at java.lang.reflect.Method.invokeNative(Native Method) at java.lang.reflect.Method.invoke(Method.java:511) at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:288) at android.view.View.performClick(View.java:4204) at android.view.View$PerformClick.run(View.java:17355) at android.os.Handler.handleCallback(Handler.java:725) at android.os.Handler.dispatchMessage(Handler.java:92) at android.os.Looper.loop(Looper.java:137) at android.app.ActivityThread.main(ActivityThread.java:5041) at java.lang.reflect.Method.invokeNative(Native Method) at java.lang.reflect.Method.invoke(Method.java:511) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560) at dalvik.system.NativeStart.main(Native Method) Caused by: com.google.gson.JsonSyntaxException: com.google.gson.stream.MalformedJsonException: Unterminated array at line 1 column 35 path $.[1] at com.google.gson.Gson.fromJson(Gson.java:894) at com.google.gson.Gson.fromJson(Gson.java:844) at com.google.gson.Gson.fromJson(Gson.java:793) at com.google.gson.Gson.fromJson(Gson.java:765) at com.gotb.testretrofit.MainActivity.onClickTranslate(MainActivity.java:65) at java.lang.reflect.Method.invokeNative(Native Method) at java.lang.reflect.Method.invoke(Method.java:511) at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:288) at android.view.View.performClick(View.java:4204) at android.view.View$PerformClick.run(View.java:17355) at android.os.Handler.handleCallback(Handler.java:725) at android.os.Handler.dispatchMessage(Handler.java:92) at android.os.Looper.loop(Looper.java:137) at android.app.ActivityThread.main(ActivityThread.java:5041) at java.lang.reflect.Method.invokeNative(Native Method) at java.lang.reflect.Method.invoke(Method.java:511) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560) at dalvik.system.NativeStart.main(Native Method) Caused by: com.google.gson.stream.MalformedJsonException: Unterminated array at line 1 column 35 path $.[1] at com.google.gson.stream.JsonReader.syntaxError(JsonReader.java:1567) at com.google.gson.stream.JsonReader.doPeek(JsonReader.java:480) at com.google.gson.stream.JsonReader.hasNext(JsonReader.java:418) at com.google.gson.internal.bind.ObjectTypeAdapter.read(ObjectTypeAdapter.java:60) at com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.read(TypeAdapterRuntimeTypeWrapper.java:40) at com.google.gson.internal.bind.MapTypeAdapterFactory$Adapter.read(MapTypeAdapterFactory.java:187) at com.google.gson.internal.bind.MapTypeAdapterFactory$Adapter.read(MapTypeAdapterFactory.java:145) at com.google.gson.Gson.fromJson(Gson.java:879) at com.google.gson.Gson.fromJson(Gson.java:844) at com.google.gson.Gson.fromJson(Gson.java:793) at com.google.gson.Gson.fromJson(Gson.java:765) at com.gotb.testretrofit.MainActivity.onClickTranslate(MainActivity.java:65) at java.lang.reflect.Method.invokeNative(Native Method) at java.lang.reflect.Method.invoke(Method.java:511) at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:288) at android.view.View.performClick(View.java:4204) at android.view.View$PerformClick.run(View.java:17355) at android.os.Handler.handleCallback(Handler.java:725) at android.os.Handler.dispatchMessage(Handler.java:92) at android.os.Looper.loop(Looper.java:137) at android.app.ActivityThread.main(ActivityThread.java:5041) at java.lang.reflect.Method.invokeNative(Native Method) at java.lang.reflect.Method.invoke(Method.java:511) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560) at dalvik.system.NativeStart.main(Native Method)