为什么POST请求体中的字符串带有额外的引号而不是JSON对象



我正在调用一个用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在请求发送时被第二次序列化。

修复

  1. 只在前端序列化一次-无论你使用的是什么库(我不做android的东西)应该有方法,你提供有效载荷作为Оbject-方法参数应该是地图,userData在你的情况下。
call = ApiClient.getInstance().getMyApi().callLogin(userData);

差不多。

  1. 或者在后端进行双反序列化-反序列化到String,然后再反序列化结果字符串到您需要的任何内容。
String jsonString = gson.fromJson(doubleJson, String.class);
Map<String, String> result = gson.fromJson(jsonString, Map.class);
System.out.println(result);

相关内容

  • 没有找到相关文章

最新更新