我正在调用一个用Java编写的RestFul API,它使用纯文本或JSON并以JSON返回响应。我正在使用gson库来生成和解析我的字段。我从Android模拟中调用api,其中我用户retrofit2库和GsonConverterFactory。生成的字符串看起来很好。我没有使用POJO,只是一个通用的HashMap,然后我将其转换为字符串。
从Android生成的gson为{"password";K16073";userid"; "K16073"}
代码如下所示。在API服务中,接收到的字符串被额外的双引号包裹。
打印字符串,包括开头和结尾的引号"{"密码":"K16073",用户id";K16073">
因此我得到java.lang。IllegalStateException:非JSON对象:"{"password";K16073";userid";;K16073";
我试图删除引号,然后我得到com.google.gson。JsonSyntaxException: com.google.gson.stream. malformmedjsonexception:第1行第2列路径$.
/* 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生成的方式有什么问题。
原因
你正在进行双序列化。
call = ApiClient.getInstance().getMyApi().callLogin(gson.toJson(userData));
这里你的map被序列化为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);