"Expected BEGIN_OBJECT but was STRING at line 1 column 1"
"Expected BEGIN_OBJECT but was STRING at line 1 column 1"
我有这个方法:
public static Object parseStringToObject(String json) {
String Object = json;
Gson gson = new Gson();
Object objects = gson.fromJson(object, Object.class);
parseConfigFromObjectToString(object);
return objects;
}
我想用以下方法解析 JSON:
public static void addObject(String IP, Object addObject) {
try {
String json = sendPostRequest("http://" + IP + ":3000/config/add_Object", ConfigJSONParser.parseConfigFromObjectToString(addObject));
addObject = ConfigJSONParser.parseStringToObject(json);
} catch (Exception ex) {
ex.printStackTrace();
}
}
但我收到一条错误消息:
com.google.gson.JsonSyntaxException: java.lang.IllegalStateException:
Expected BEGIN_OBJECT but was STRING at line 1 column 1
即使没有看到您的 JSON 字符串,您也可以从错误消息中看出它不是解析为您的 class.
实例的正确结构
Gson 期望您的 JSON 字符串以对象左大括号开头。例如
{
但是您传递给它的字符串以左引号开头
"
也许您的 JSON Object
是正确的,但是您收到的响应不是您的有效 data.Just 就像您连接无效 WiFi
时,您可能会收到一个奇怪的响应 < html>.....< /html>
GSON
无法解析。
您可能需要为这个奇怪的响应做一些 try..catch..
以避免崩溃。
来自服务器的无效 JSON 应该始终是预期的用例。传输过程中可能会出现一百万件事。 Gson有点棘手,因为它的错误输出会给你一个问题,你捕获的实际异常将是不同的类型。
考虑到所有这些,客户端的正确修复是
try
{
gson.fromJSON(ad, Ad.class);
//...
}
catch (IllegalStateException | JsonSyntaxException exception)
{
//...
如果你想知道为什么你从服务器收到的 JSON 是错误的,你可以在异常处查看你的 catch 块。但即使这是您的问题,客户也没有责任修复 JSON 从互联网接收的信息。
无论哪种方式,客户有责任决定在情况变坏时要做什么 JSON。两种可能性是拒绝 JSON 并且什么也不做,然后再试一次。
如果您要重试,我强烈建议在 try/catch 块内设置一个标志,然后在 try/catch 块外响应该标志。嵌套的 try / catch 可能是 Gson 如何让我们陷入堆栈跟踪和异常不匹配的混乱局面。
换句话说,虽然我承认它看起来不太优雅,但我还是推荐
boolean failed = false;
try
{
gson.fromJSON(ad, Ad.class);
//...
}
catch (IllegalStateException | JsonSyntaxException exception)
{
failed = true;
//...
}
if (failed)
{
//...
在 Retrofit2 中,如果您想以原始格式发送参数,则必须使用标量。
首先将此添加到您的 gradle:
compile 'com.squareup.retrofit2:retrofit:2.3.0'
compile 'com.squareup.retrofit2:converter-gson:2.3.0'
compile 'com.squareup.retrofit2:converter-scalars:2.3.0'
public interface ApiInterface {
String URL_BASE = "http://10.157.102.22/rest/";
@Headers("Content-Type: application/json")
@POST("login")
Call<User> getUser(@Body String body);
}
我的示例活动:
public class SampleActivity extends AppCompatActivity implements Callback<User> {
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_sample);
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(ApiInterface.URL_BASE)
.addConverterFactory(ScalarsConverterFactory.create())
.addConverterFactory(GsonConverterFactory.create())
.build();
ApiInterface apiInterface = retrofit.create(ApiInterface.class);
// prepare call in Retrofit 2.0
try {
JSONObject paramObject = new JSONObject();
paramObject.put("email", "sample@gmail.com");
paramObject.put("pass", "4384984938943");
Call<User> userCall = apiInterface.getUser(paramObject.toString());
userCall.enqueue(this);
} catch (JSONException e) {
e.printStackTrace();
}
}
@Override
public void onResponse(Call<User> call, Response<User> response) {
}
@Override
public void onFailure(Call<User> call, Throwable t) {
}
}
参考:[How to POST raw whole JSON in the body of a Retrofit request?
不要在 JSON 对象上使用 jsonObject.toString
。
确保你有 DESERIALIZED 对象,比如 DATE/DATETIME 等。如果你直接发送 JSON 而没有反序列化它,那么它可能会导致这个问题。
我来分享一个解决方案。强制笔记本挂断后,我发生了这个错误。可能的解决方案 clean preject
.
在我的例子中,我返回 JSON 对象作为
{"data":"","message":"Attendance Saved
Successfully..!!!","status":"success"}
通过将其更改为
来解决
{"data":{},"message":"Attendance Saved
Successfully..!!!","status":"success"}
这里的数据是一个子 JsonObject,它应该从 { 而不是 ""
如果您的 json 格式和变量没问题,那么检查您的数据库查询...即使数据正确保存在数据库中,实际问题也可能在那里...重新检查您的查询并重试。 . 希望对你有帮助
在我的情况下,我有一个 "model",由几个字符串参数组成,除了一个:它是字节数组 byte[]
。
一些代码片段:
String response = args[0].toString();
Gson gson = new Gson();
BaseModel responseModel = gson.fromJson(response, BaseModel.class);
上面最后一行是当
java.lang.IllegalStateException: Expected BEGIN_OBJECT but was STRING at line 1 column
被触发。通过 SO 搜索,我意识到我需要某种形式的 Adapter
来将我的 BaseModel
来回转换为 JsonObject。在模型中混合 String
和 byte[]
确实使事情复杂化。显然,Gson
不太喜欢这种情况。
我最终制作了一个 Adapter
以确保 byte[]
转换为 Base64
格式。这是我的 Adapter
class:
public class ByteArrayToBase64Adapter implements JsonSerializer<byte[]>, JsonDeserializer<byte[]> {
@Override
public byte[] deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
return Base64.decode(json.getAsString(), Base64.NO_WRAP);
}
@Override
public JsonElement serialize(byte[] src, Type typeOfSrc, JsonSerializationContext context) {
return new JsonPrimitive(Base64.encodeToString(src, Base64.NO_WRAP));
}
}
为了将 JSONObject 转换为模型,我使用了以下内容:
Gson customGson = new GsonBuilder().registerTypeHierarchyAdapter(byte[].class, new ByteArrayToBase64Adapter()).create();
BaseModel responseModel = customGson.fromJson(response, BaseModel.class);
同样,为了将模型转换为 JSONObject,我使用了以下内容:
Gson customGson = new GsonBuilder().registerTypeHierarchyAdapter(byte[].class, new ByteArrayToBase64Adapter()).create();
String responseJSon = customGson.toJson(response);
代码所做的基本上是将预期的 class/object
(在本例中为 byte[]
class)推入 Adapter
转换 to/fro JSONObject.
不要忘记首先使用 Gson()
将您的对象转换为 Json
val fromUserJson = Gson().toJson(notificationRequest.fromUser)
然后您可以使用这个很棒的库轻松地将它转换回对象
val fromUser = Gson().fromJson(fromUserJson, User::class.java)
我有一个案例是从手写的 json 文件中读取的。 json 是完美的。然而,出现了这个错误。所以我从 java 对象写入 json 文件,然后从那个 json 文件读取。一切都很好。我看不出手写 json 和来自 java 对象的任何区别。试过 beyondCompare 看不出有什么区别。
我终于注意到这两个文件的大小略有不同,我使用了 winHex 工具并检测到了额外的东西。
所以针对我的情况的解决方案是,复制好的 json 文件,将内容粘贴到其中并使用。
我最近遇到了类似的问题,并找到了一个有趣的解决方案。基本上我需要将以下嵌套 JSON 字符串反序列化到我的 POJO:
"{\"restaurant\":{\"id\":\"abc-012\",\"name\":\"good restaurant\",\"foodType\":\"American\",\"phoneNumber\":\"123-456-7890\",\"currency\":\"USD\",\"website\":\"website.com\",\"location\":{\"address\":{\"street\":\" Good Street\",\"city\":\"Good City\",\"state\":\"CA\",\"country\":\"USA\",\"postalCode\":\"12345\"},\"coordinates\":{\"latitude\":\"00.7904692\",\"longitude\":\"-000.4047208\"}},\"restaurantUser\":{\"firstName\":\"test\",\"lastName\":\"test\",\"email\":\"test@test.com\",\"title\":\"server\",\"phone\":\"0000000000\"}}}"
我最终使用正则表达式删除了 JSON 开头和结尾的左引号,然后使用了 apache.commons unescapeJava () 方法对其进行反转义。基本上将不干净的 JSON 传递给以下方法以取回干净的:
private String removeQuotesAndUnescape(String uncleanJson) {
String noQuotes = uncleanJson.replaceAll("^\"|\"$", "");
return StringEscapeUtils.unescapeJava(noQuotes);
}
然后用GoogleGSON解析成我自己的Object:
MyObject myObject = new.Gson().fromJson(this.removeQuotesAndUnescape(uncleanJson));
就我而言,我的自定义 http-client 不支持 gzip 编码。我正在发送“Accept-Encoding:gzip”header,因此响应作为 gzip 字符串发回并且无法解码。
解决方案是不发送 header。
我在 Android[=17= 中使用 Retrofit 使用一些参数发出 POST 请求]
我所面对的:
我在 Android Studio logcat 中遇到的错误:
java.lang.IllegalStateException: Expected BEGIN_OBJECT but was STRING
at line 2 column 1 path $
[但它在 VOLLY 库中运行良好]
当我用谷歌搜索时...
你知道[显然 json 期待一个 OBJECT 但是...]
但是当我将服务更改为 return 一个简单的字符串时 [比如 print_r("don't lose hope") ] 或
完全没有注意到
它在 Postman 中打印得很好
但在 Android 工作室 logcat 中,它仍然是同样的错误 [
java.lang.IllegalStateException: Expected BEGIN_OBJECT but was STRING
at line 2 column 1 path $
]
等一下,我正在发送一条简单的消息或不发送任何响应,但工作室仍在
告诉我“...预期 BEGIN_OBJECT 但实际上是 STRING...”
出了点问题
第 4 天:
我终于停下来寻找“快速解决方案”并真正阅读了一些堆栈溢出问题
和文章仔细。
我得到了什么:
它将向您显示来自您的服务器的任何数据[甚至是 eco 消息]
Andorid 工作室 logcat,
这样你就可以找到问题了。
我发现我正在使用@Body 发送数据,比如-
@Headers("Content-Type: application/json")
@POST("CreateNewPost")
Call<Resp> createNewPost(@Body ParaModel paraModel);
但是没有参数到达服务器,一切都是空的[我发现使用日志拦截器]
然后我简单的搜了一篇文章《如何使用Retrofit进行POST请求》
here's one
解决方案:
从这里我将我的方法更改为:
@POST("CreateNewPost")
@FormUrlEncoded
Call<Resp> createNewPost(
@Field("user_id") Integer user_id,
@Field("user_name") String user_name,
@Field("description") String description,
@Field("tags") String tags);
一切都很好。
结论:
我不明白为什么 Retrofit 报这个错误
java.lang.IllegalStateException: Expected BEGIN_OBJECT but was STRING
at line 2 column 1 path $
完全没有任何意义。
所以总是详细调试,然后找到泄漏的地方,然后修复。
This error solved for by replacing .toString method to .string on the response
toString => string (add in try{...code..}catche(IOException e))
below code is working for me
try {
MainModelResponse model;
Gson gson = new GsonBuilder().create();
if (response.code() == ConstantValues.SUCCESS_OK) {
model = gson.fromJson(response.body().string(), MainModelResponse.class);
} else {
model = gson.fromJson(response.errorBody().string(), MainModelResponse.class);
}
moduleData.postValue(model);
}catch (IllegalStateException | JsonSyntaxException | IOException exception){
exception.printStackTrace();
}
}
使用字符串 begin & end with {}。
比如
final String jsStr = "{\"metric\":\"opentsdb_metric\",\"tags\":{\"testtag\":\"sunbotest\"},\"aggregateTags\":[],\"dps\":{\"1483399261\":18}}";
DataPoint dataPoint = new Gson().fromJson(jsStr, DataPoint.class);
这对我有用。
在我的例子中,即使 Json Validator 给了它一个有效的响应,对象也没有问题,但我使用的是这样的界面
@POST(NetworkConstants.REGISTER_USER)
Call<UserResponse> registerUser(
@Query("name") String name,
@Query("email") String email,
@Query("password") String password,
@Query("created_date") Long creationDate
);
然后我把代码改成了
@FormUrlEncoded
@POST(NetworkConstants.REGISTER_USER)
Call<UserResponse> registerUser(
@Field("name") String name,
@Field("email") String email,
@Field("password") String password,
@Field("created_date") Long creationDate
);
一切都解决了。
我的问题与我的代码无关
从其他项目复制一些文件后出现此问题
在栈中指向Gson库
在android studio 4.2.1 中,当我尝试文件-> 无效并重新启动时,这个问题没有解决
和
在第一次构建重启后出现同样的错误,但在第二次构建中这个问题解决了
我不明白为什么会这样
我使用的是旧版本的改装库。所以我要做的就是在将代码升级到 com.squareup.retrofit2:retrofit:2.9.0
:
之后更改我的代码
@POST(AppConstants.UPLOAD_TRANSACTION_DETAIL)
fun postPremiumAppTransactionDetail(
@Query("name") planName:String,
@Query("amount") amount:String,
@Query("user_id") userId: String,
@Query("sub_id") planId: String,
@Query("folder") description:String,
@Query("payment_type") paymentType:String):
Call<TransactionResponseModel>
为此:
@FormUrlEncoded
@POST(AppConstants.UPLOAD_TRANSACTION_DETAIL)
fun postPremiumAppTransactionDetail(
@Field("name") planName:String,
@Field("amount") amount:String,
@Field("user_id") userId: String,
@Field("sub_id") planId: String,
@Field("folder") description:String,
@Field("payment_type") paymentType:String):
Call<TransactionResponseModel>
我有这个方法:
public static Object parseStringToObject(String json) {
String Object = json;
Gson gson = new Gson();
Object objects = gson.fromJson(object, Object.class);
parseConfigFromObjectToString(object);
return objects;
}
我想用以下方法解析 JSON:
public static void addObject(String IP, Object addObject) {
try {
String json = sendPostRequest("http://" + IP + ":3000/config/add_Object", ConfigJSONParser.parseConfigFromObjectToString(addObject));
addObject = ConfigJSONParser.parseStringToObject(json);
} catch (Exception ex) {
ex.printStackTrace();
}
}
但我收到一条错误消息:
com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected BEGIN_OBJECT but was STRING at line 1 column 1
即使没有看到您的 JSON 字符串,您也可以从错误消息中看出它不是解析为您的 class.
实例的正确结构Gson 期望您的 JSON 字符串以对象左大括号开头。例如
{
但是您传递给它的字符串以左引号开头
"
也许您的 JSON Object
是正确的,但是您收到的响应不是您的有效 data.Just 就像您连接无效 WiFi
时,您可能会收到一个奇怪的响应 < html>.....< /html>
GSON
无法解析。
您可能需要为这个奇怪的响应做一些 try..catch..
以避免崩溃。
来自服务器的无效 JSON 应该始终是预期的用例。传输过程中可能会出现一百万件事。 Gson有点棘手,因为它的错误输出会给你一个问题,你捕获的实际异常将是不同的类型。
考虑到所有这些,客户端的正确修复是
try
{
gson.fromJSON(ad, Ad.class);
//...
}
catch (IllegalStateException | JsonSyntaxException exception)
{
//...
如果你想知道为什么你从服务器收到的 JSON 是错误的,你可以在异常处查看你的 catch 块。但即使这是您的问题,客户也没有责任修复 JSON 从互联网接收的信息。
无论哪种方式,客户有责任决定在情况变坏时要做什么 JSON。两种可能性是拒绝 JSON 并且什么也不做,然后再试一次。
如果您要重试,我强烈建议在 try/catch 块内设置一个标志,然后在 try/catch 块外响应该标志。嵌套的 try / catch 可能是 Gson 如何让我们陷入堆栈跟踪和异常不匹配的混乱局面。
换句话说,虽然我承认它看起来不太优雅,但我还是推荐
boolean failed = false;
try
{
gson.fromJSON(ad, Ad.class);
//...
}
catch (IllegalStateException | JsonSyntaxException exception)
{
failed = true;
//...
}
if (failed)
{
//...
在 Retrofit2 中,如果您想以原始格式发送参数,则必须使用标量。
首先将此添加到您的 gradle:
compile 'com.squareup.retrofit2:retrofit:2.3.0'
compile 'com.squareup.retrofit2:converter-gson:2.3.0'
compile 'com.squareup.retrofit2:converter-scalars:2.3.0'
public interface ApiInterface {
String URL_BASE = "http://10.157.102.22/rest/";
@Headers("Content-Type: application/json")
@POST("login")
Call<User> getUser(@Body String body);
}
我的示例活动:
public class SampleActivity extends AppCompatActivity implements Callback<User> {
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_sample);
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(ApiInterface.URL_BASE)
.addConverterFactory(ScalarsConverterFactory.create())
.addConverterFactory(GsonConverterFactory.create())
.build();
ApiInterface apiInterface = retrofit.create(ApiInterface.class);
// prepare call in Retrofit 2.0
try {
JSONObject paramObject = new JSONObject();
paramObject.put("email", "sample@gmail.com");
paramObject.put("pass", "4384984938943");
Call<User> userCall = apiInterface.getUser(paramObject.toString());
userCall.enqueue(this);
} catch (JSONException e) {
e.printStackTrace();
}
}
@Override
public void onResponse(Call<User> call, Response<User> response) {
}
@Override
public void onFailure(Call<User> call, Throwable t) {
}
}
参考:[How to POST raw whole JSON in the body of a Retrofit request?
不要在 JSON 对象上使用 jsonObject.toString
。
确保你有 DESERIALIZED 对象,比如 DATE/DATETIME 等。如果你直接发送 JSON 而没有反序列化它,那么它可能会导致这个问题。
我来分享一个解决方案。强制笔记本挂断后,我发生了这个错误。可能的解决方案 clean preject
.
在我的例子中,我返回 JSON 对象作为
{"data":"","message":"Attendance Saved Successfully..!!!","status":"success"}
通过将其更改为
来解决{"data":{},"message":"Attendance Saved Successfully..!!!","status":"success"}
这里的数据是一个子 JsonObject,它应该从 { 而不是 ""
如果您的 json 格式和变量没问题,那么检查您的数据库查询...即使数据正确保存在数据库中,实际问题也可能在那里...重新检查您的查询并重试。 . 希望对你有帮助
在我的情况下,我有一个 "model",由几个字符串参数组成,除了一个:它是字节数组 byte[]
。
一些代码片段:
String response = args[0].toString();
Gson gson = new Gson();
BaseModel responseModel = gson.fromJson(response, BaseModel.class);
上面最后一行是当
java.lang.IllegalStateException: Expected BEGIN_OBJECT but was STRING at line 1 column
被触发。通过 SO 搜索,我意识到我需要某种形式的 Adapter
来将我的 BaseModel
来回转换为 JsonObject。在模型中混合 String
和 byte[]
确实使事情复杂化。显然,Gson
不太喜欢这种情况。
我最终制作了一个 Adapter
以确保 byte[]
转换为 Base64
格式。这是我的 Adapter
class:
public class ByteArrayToBase64Adapter implements JsonSerializer<byte[]>, JsonDeserializer<byte[]> {
@Override
public byte[] deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
return Base64.decode(json.getAsString(), Base64.NO_WRAP);
}
@Override
public JsonElement serialize(byte[] src, Type typeOfSrc, JsonSerializationContext context) {
return new JsonPrimitive(Base64.encodeToString(src, Base64.NO_WRAP));
}
}
为了将 JSONObject 转换为模型,我使用了以下内容:
Gson customGson = new GsonBuilder().registerTypeHierarchyAdapter(byte[].class, new ByteArrayToBase64Adapter()).create();
BaseModel responseModel = customGson.fromJson(response, BaseModel.class);
同样,为了将模型转换为 JSONObject,我使用了以下内容:
Gson customGson = new GsonBuilder().registerTypeHierarchyAdapter(byte[].class, new ByteArrayToBase64Adapter()).create();
String responseJSon = customGson.toJson(response);
代码所做的基本上是将预期的 class/object
(在本例中为 byte[]
class)推入 Adapter
转换 to/fro JSONObject.
不要忘记首先使用 Gson()
将您的对象转换为 Json val fromUserJson = Gson().toJson(notificationRequest.fromUser)
然后您可以使用这个很棒的库轻松地将它转换回对象
val fromUser = Gson().fromJson(fromUserJson, User::class.java)
我有一个案例是从手写的 json 文件中读取的。 json 是完美的。然而,出现了这个错误。所以我从 java 对象写入 json 文件,然后从那个 json 文件读取。一切都很好。我看不出手写 json 和来自 java 对象的任何区别。试过 beyondCompare 看不出有什么区别。 我终于注意到这两个文件的大小略有不同,我使用了 winHex 工具并检测到了额外的东西。 所以针对我的情况的解决方案是,复制好的 json 文件,将内容粘贴到其中并使用。
我最近遇到了类似的问题,并找到了一个有趣的解决方案。基本上我需要将以下嵌套 JSON 字符串反序列化到我的 POJO:
"{\"restaurant\":{\"id\":\"abc-012\",\"name\":\"good restaurant\",\"foodType\":\"American\",\"phoneNumber\":\"123-456-7890\",\"currency\":\"USD\",\"website\":\"website.com\",\"location\":{\"address\":{\"street\":\" Good Street\",\"city\":\"Good City\",\"state\":\"CA\",\"country\":\"USA\",\"postalCode\":\"12345\"},\"coordinates\":{\"latitude\":\"00.7904692\",\"longitude\":\"-000.4047208\"}},\"restaurantUser\":{\"firstName\":\"test\",\"lastName\":\"test\",\"email\":\"test@test.com\",\"title\":\"server\",\"phone\":\"0000000000\"}}}"
我最终使用正则表达式删除了 JSON 开头和结尾的左引号,然后使用了 apache.commons unescapeJava () 方法对其进行反转义。基本上将不干净的 JSON 传递给以下方法以取回干净的:
private String removeQuotesAndUnescape(String uncleanJson) {
String noQuotes = uncleanJson.replaceAll("^\"|\"$", "");
return StringEscapeUtils.unescapeJava(noQuotes);
}
然后用GoogleGSON解析成我自己的Object:
MyObject myObject = new.Gson().fromJson(this.removeQuotesAndUnescape(uncleanJson));
就我而言,我的自定义 http-client 不支持 gzip 编码。我正在发送“Accept-Encoding:gzip”header,因此响应作为 gzip 字符串发回并且无法解码。
解决方案是不发送 header。
我在 Android[=17= 中使用 Retrofit 使用一些参数发出 POST 请求]
我所面对的:
我在 Android Studio logcat 中遇到的错误:
java.lang.IllegalStateException: Expected BEGIN_OBJECT but was STRING at line 2 column 1 path $
[但它在 VOLLY 库中运行良好]
当我用谷歌搜索时... 你知道[显然 json 期待一个 OBJECT 但是...]
但是当我将服务更改为 return 一个简单的字符串时 [比如 print_r("don't lose hope") ] 或 完全没有注意到
它在 Postman 中打印得很好 但在 Android 工作室 logcat 中,它仍然是同样的错误 [
java.lang.IllegalStateException: Expected BEGIN_OBJECT but was STRING at line 2 column 1 path $
]
等一下,我正在发送一条简单的消息或不发送任何响应,但工作室仍在 告诉我“...预期 BEGIN_OBJECT 但实际上是 STRING...” 出了点问题
第 4 天: 我终于停下来寻找“快速解决方案”并真正阅读了一些堆栈溢出问题 和文章仔细。
我得到了什么:
它将向您显示来自您的服务器的任何数据[甚至是 eco 消息] Andorid 工作室 logcat, 这样你就可以找到问题了。
我发现我正在使用@Body 发送数据,比如-
@Headers("Content-Type: application/json")
@POST("CreateNewPost")
Call<Resp> createNewPost(@Body ParaModel paraModel);
但是没有参数到达服务器,一切都是空的[我发现使用日志拦截器]
然后我简单的搜了一篇文章《如何使用Retrofit进行POST请求》 here's one
解决方案:
从这里我将我的方法更改为:
@POST("CreateNewPost")
@FormUrlEncoded
Call<Resp> createNewPost(
@Field("user_id") Integer user_id,
@Field("user_name") String user_name,
@Field("description") String description,
@Field("tags") String tags);
一切都很好。
结论:
我不明白为什么 Retrofit 报这个错误
java.lang.IllegalStateException: Expected BEGIN_OBJECT but was STRING at line 2 column 1 path $
完全没有任何意义。
所以总是详细调试,然后找到泄漏的地方,然后修复。
This error solved for by replacing .toString method to .string on the response
toString => string (add in try{...code..}catche(IOException e))
below code is working for me
try {
MainModelResponse model;
Gson gson = new GsonBuilder().create();
if (response.code() == ConstantValues.SUCCESS_OK) {
model = gson.fromJson(response.body().string(), MainModelResponse.class);
} else {
model = gson.fromJson(response.errorBody().string(), MainModelResponse.class);
}
moduleData.postValue(model);
}catch (IllegalStateException | JsonSyntaxException | IOException exception){
exception.printStackTrace();
}
}
使用字符串 begin & end with {}。
比如
final String jsStr = "{\"metric\":\"opentsdb_metric\",\"tags\":{\"testtag\":\"sunbotest\"},\"aggregateTags\":[],\"dps\":{\"1483399261\":18}}";
DataPoint dataPoint = new Gson().fromJson(jsStr, DataPoint.class);
这对我有用。
在我的例子中,即使 Json Validator 给了它一个有效的响应,对象也没有问题,但我使用的是这样的界面
@POST(NetworkConstants.REGISTER_USER)
Call<UserResponse> registerUser(
@Query("name") String name,
@Query("email") String email,
@Query("password") String password,
@Query("created_date") Long creationDate
);
然后我把代码改成了
@FormUrlEncoded
@POST(NetworkConstants.REGISTER_USER)
Call<UserResponse> registerUser(
@Field("name") String name,
@Field("email") String email,
@Field("password") String password,
@Field("created_date") Long creationDate
);
一切都解决了。
我的问题与我的代码无关
从其他项目复制一些文件后出现此问题
在栈中指向Gson库
在android studio 4.2.1 中,当我尝试文件-> 无效并重新启动时,这个问题没有解决
和
在第一次构建重启后出现同样的错误,但在第二次构建中这个问题解决了
我不明白为什么会这样
我使用的是旧版本的改装库。所以我要做的就是在将代码升级到 com.squareup.retrofit2:retrofit:2.9.0
:
@POST(AppConstants.UPLOAD_TRANSACTION_DETAIL)
fun postPremiumAppTransactionDetail(
@Query("name") planName:String,
@Query("amount") amount:String,
@Query("user_id") userId: String,
@Query("sub_id") planId: String,
@Query("folder") description:String,
@Query("payment_type") paymentType:String):
Call<TransactionResponseModel>
为此:
@FormUrlEncoded
@POST(AppConstants.UPLOAD_TRANSACTION_DETAIL)
fun postPremiumAppTransactionDetail(
@Field("name") planName:String,
@Field("amount") amount:String,
@Field("user_id") userId: String,
@Field("sub_id") planId: String,
@Field("folder") description:String,
@Field("payment_type") paymentType:String):
Call<TransactionResponseModel>