我正在调用一个用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的生成方式有什么问题。
1条答案
按热度按时间hfsqlsce1#
"原因"
您正在进行双重序列化。
在这里,您的map被序列化为json字符串,然后在发送请求时,这个json被第二次序列化。
修复
1.只在前端序列化一次-无论你使用什么库(我不做android的东西)都应该有一个方法,你以
Оbject
的形式提供有效负载-方法参数应该是map,在你的例子中是userData
。差不多吧。
1.或者在后端进行两次反序列化-反序列化为
String
,然后再次将结果字符串反序列化为所需的任何字符串。