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

pjngdqdw  于 2022-11-06  发布在  其他
关注(0)|答案(1)|浏览(263)

我正在调用一个用Java编写的RestFul API,它使用纯文本或JSON,并返回JSON格式的响应。我正在使用gson库生成和解析我的字段。我正在从Android模拟中调用该API,在那里我使用retrofit 2库和GsonConverterFactory。生成的String看起来不错。我没有使用POJO,只是一个通用的HashMap,然后我将其转换为String。
从Android生成的gson为{“密码”:“K16073”,“用户ID”:“K16073”}
下面给出的代码。在API服务中,收到的字符串用附加的双引号括起来。
在开头和结尾包含引号的打印字符串“{\“密码":\“K16073",\“用户ID":\“K16073"}”
因为这个原因,我得到了 java.lang.IllegalStateException:不是JSON对象:“{\“密码":\“K16073",\“用户标识":\“K16073"}"
我尝试删除引号,然后我得到 com.google.gson.jsonSyntaxException:com.google.gson.stream.MalformedJsonException:路径$. 的第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的生成方式有什么问题。

hfsqlsce

hfsqlsce1#

"原因"
您正在进行双重序列化。

call = ApiClient.getInstance().getMyApi().callLogin(gson.toJson(userData));

在这里,您的map被序列化为json字符串,然后在发送请求时,这个json被第二次序列化。

修复

1.只在前端序列化一次-无论你使用什么库(我不做android的东西)都应该有一个方法,你以Оbject的形式提供有效负载-方法参数应该是map,在你的例子中是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);

相关问题