我正在呼叫用 Java 撰寫的 RestFul API,它使用純文本或 JSON 并以 JSON 格式回傳回應。我正在使用 gson 庫來生成和決議我的欄位。我從我使用retrofit2 庫和GsonConverterFactory 的Android 模擬中呼叫api。生成的字串似乎很好。我沒有使用 POJO,只是一個通用的 HashMap,然后我將其轉換為字串。
從 Android 生成的 gson 是 {"password":"K16073","userid":"K16073"}
下面給出的代碼。在 API 服務中,接收到的字串用額外的雙引號括起來。
列印的字串,包括開頭和結尾的引號 "{\"password\":\"K16073\",\"userid\":\"K16073\"}"
因此,我得到java.lang.IllegalStateException: Not a JSON Object: "{\"password\":\"K16073\",\"userid\":\"K16073\"}"
我試圖洗掉引號,然后我得到com.google.gson.JsonSyntaxException: com.google.gson.stream.MalformedJsonException: Expected name at line 1 column 2 path $.
/* Android code */
Gson gson = new GsonBuilder()
.setLenient()
.create();
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(myRFReceivingApis.BASE_URL)
.addConverterFactory(GsonConverterFactory.create())
.build();
Map<String, String> userData = new HashMap<>();
userData.put("userid",edtTxtUserId.getText().toString());
userData.put("password",editTxtPassword.getText().toString());
Gson gson = new Gson();
System.out.println(" generated gson " gson.toJson(userData));
call = ApiClient.getInstance().getMyApi().callLogin(gson.toJson(userData));
call.enqueue(new Callback<Object>() {
@Override
public void onResponse(Call<Object> call, Response<Object> response) {
textViewResp.setText(response.body().toString());
:
/* End of Android code */
Java 中的 API 服務代碼
@POST
@Produces(MediaType.APPLICATION_JSON)
@Consumes({MediaType.TEXT_PLAIN, MediaType.APPLICATION_JSON})
@Path("login")
public String RFLoginNew(String jsonString) {
String result = jsonString.substring(1, jsonString.length() - 1);
System.out.println(" Json String " result);
// tried using JsonParser -- line 1 below
JsonObject o = JsonParser.parseString(result).getAsJsonObject();
// tried using Gson gson.fromJson
Gson gson = new Gson();
JsonElement element = gson.fromJson (result, JsonElement.class); //Converts the json string to JsonElement without POJO
JsonObject jsonObj = element.getAsJsonObject(); //Converting JsonElement to JsonObject
// --line 2 below
System.out.println(" RFLoginNew struser " jsonObj.get("userid").getAsString());
我沒有得到正確的 json 格式。我不確定生成 jsonString 的方式有什么問題。
uj5u.com熱心網友回復:
原因
您正在進行雙重序列化。
call = ApiClient.getInstance().getMyApi().callLogin(gson.toJson(userData));
在這里,您的地圖被序列化為 json 字串,然后在發送請求時該 json 被第二次序列化。
使固定
- 僅在前端序列化一次-您使用的任何庫(我不做android的東西)都應該具有提供有效負載的方法-在您的情況下
Оbject,方法引數應該是地圖。userData
call = ApiClient.getInstance().getMyApi().callLogin(userData);
類似的東西。
- 或在后端進行雙重反序列化 - 反序列化為
String,然后將生成的字串再次反序列化為您需要的任何內容。
String jsonString = gson.fromJson(doubleJson, String.class);
Map<String, String> result = gson.fromJson(jsonString, Map.class);
System.out.println(result);
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/487046.html
標籤:爪哇 安卓 格森 改造2 jdeveloper-11g
