我有这个方法:
public static Object parseStringToObject(String json) {
String Object = json;
Gson gson = new Gson();
Object objects = gson.fromJson(object, Object.class);
parseConfigFromObjectToString(object);
return objects;
}
Run Code Online (Sandbox Code Playgroud)
我想解析一个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();
}
}
Run Code Online (Sandbox Code Playgroud)
但是我收到一条错误消息:
com.google.gson.JsonSyntaxException:java.lang.IllegalStateException:预期为BEGIN_OBJECT但在第1行第1列为STRING
我想使用改装2从我的api获取字符串json,使用改装1获取此json时我没有问题,但使用retrofit 2 为我返回null.
这就是我的json的样子
{"id":1,"Username":"admin","Level":"Administrator"}
Run Code Online (Sandbox Code Playgroud)
这是我的API
@FormUrlEncoded
@POST("/api/level")
Call<ResponseBody> checkLevel(@Field("id") int id);
Run Code Online (Sandbox Code Playgroud)
这就是我的代码的样子
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(Config.BASE_URL)
.addConverterFactory(GsonConverterFactory.create())
.build();
Api api = retrofit.create(Api.class);
Call<ResponseBody> call = api.checkLevel(1);
call.enqueue(new Callback<ResponseBody>() {
@Override
public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {
JsonObject post = new JsonObject().get(response.body().toString()).getAsJsonObject();
if (post.get("Level").getAsString().contains("Administrator")) {
}
}
@Override
public void onFailure(Call<ResponseBody> call, Throwable t) {
}
});
Run Code Online (Sandbox Code Playgroud)
我是新手改造2并使用上面的代码,它总是让我的应用程序崩溃因为response.body().toString()返回null.
请指导我如何获取json字符串,以便将其转换为JsonObject.
我试图提出一个请求,我想要包含一个Header,一个form-urlencoded字段和一个json体.我的Retrofit界面如下
@FormUrlEncoded
@POST("/api/register")
Observable<RegisterResponse> register(
@Header("Authorization") String authorization,
@Field("grant_type") String grantType,
@Body RegisterBody body
);
Run Code Online (Sandbox Code Playgroud)
当我提出这个请求时,我得到了异常@Body参数,不能与表单或多部分编码一起使用.
我也尝试过@Multipart注释:
@Multipart
@FormUrlEncoded
@POST("/api/register")
Observable<RegisterResponse> register(
@Header("Authorization") String authorization,
@Part("grant_type") TypedString grantType,
@Body RegisterBody body
);
Run Code Online (Sandbox Code Playgroud)
我得到一个IllegalArgumentException,只允许一个编码注释.
这是我的第一篇文章.作为一名崭露头角的Android开发者,我每天都会在各种主题上阅读SO帖子,但对于这个问题,我没有找到Google或SO的任何帮助.
到目前为止我的研究:
搜索这个问题比正常情况更难,因为搜索引擎似乎并不关心区分大小写,这在这个问题上至关重要.搜索Google只会给我链接到课程本身,旧文章或完全不相关的文章.我得到的最接近的是JSONArray和JSONObject,这是一个完全不同的问题.SO搜索给出了相同的结果.据我所知,SO上的所有相关帖子都引用了JSONObject而不是JsonObject.
Oracle和json.org文档都没有提到另一方,也没有使用org.json库的Android开发人员JSONObject页面.
http://docs.oracle.com/javaee/7/api/javax/json/JsonObject.html
http://www.json.org/javadoc/org/json/JSONObject.html
我本来也发布了一个链接JSONObject的Android参考页面,但我作为新手的代表太低了.
问题的历史:我正在从Oracle页面阅读有关Json编码和解码的内容,我尝试复制并粘贴到我的AndriodStudio IDE中,这会立即产生错误,因为它没有像通常那样建议导入语句.我已经了解到这意味着该类不是内置库的一部分.
问题是我粘贴的代码使用的是JsonObject(来自javax.json库)而不是JSONObject(来自org.json库).当我注意到Android页面和Oracle页面之间存在差异时,我将代码从Json更改为JSON,并且我的IDE立即提供了org.json import语句.
问题:为什么当外部库是Oracle时,Oracle使类不属于默认库?
JSON是旧的,不赞成使用的方式,Json是新的,正确的方式吗?
它们功能相同吗?如果没有,请提供示例?
有些情况对一方更好,有些情况对另一方更好吗?
终极,我应该使用哪些,以及为什么(如果还没有涵盖)?
如果,javax.json,下载该库的最佳(最安全)位置在哪里?
我正在研究一个Android项目,它需要一个JSONObject作为我的POST请求的主体.在放入JSON的键和值后,我得到以下行:
{
"xxxx":"zzzzzzz",
"yyyy":"uuuuuuu"
}
Run Code Online (Sandbox Code Playgroud)
但服务器得到以下内容:
{
"name_value_pairs": {
"xxxx":"zzzzzzz",
"yyyy":"uuuuuuu"
}
}
Run Code Online (Sandbox Code Playgroud)
我已经尝试了一个JSONStringer但它并没有真正帮助,因为Content-Type请求是application/json.
UPDATE
我不是要构建一个JSONObject,因为它已经通过使用下面的代码行完成了(@osayilgan给出了相同的代码):
JSONObject jsonRequest = new JSONObject();
jsonRequest.put("xxxx", "zzzzzzz");
jsonRequest.put("yyyy", "uuuuuuu");
Run Code Online (Sandbox Code Playgroud)
这不是问题.下面描述的接口用于与服务器通信.
public interface MyService {
@Headers({"Content-type: application/json",
"Accept: */*"})
@POST("/test")
void testFunction(@Body JSONObject jsonObject, Callback<Response> callback);
}
Run Code Online (Sandbox Code Playgroud)
服务器获得了第二个JSON作为Body的请求令人失望.我注意到密钥name_value_pairs会自动添加到对象中.
有谁知道我该如何解决这个问题?
我是Retrofit的新手.我使用过Volley,我有点喜欢Retrofit.当我在尝试POST 时遇到这个非描述性的错误消息时,我正准备选择Retrofit .
Exception in thread "main" retrofit.RetrofitError
at retrofit.RetrofitError.httpError(RetrofitError.java:37)
at retrofit.RestAdapter$RestHandler.invokeRequest(RestAdapter.java:413)
at retrofit.RestAdapter$RestHandler.invoke(RestAdapter.java:282)
at myapi.api.$Proxy7.logon(Unknown Source)
at myapi.api.TestDriver.main(TestDriver.java:94)
Run Code Online (Sandbox Code Playgroud)
好吧,我必须说这种类型的错误信息与撒哈拉沙漠中的一件温暖夹克一样有用.
有没有人知道从哪里开始调试这种类型的消息?我真的不想委托一个没有提供有用错误消息的REST api.
我试图使用Retrofit2.0.2获得原始响应.
到目前为止,我尝试使用以下代码行打印响应,但它打印的地址而不是确切的响应正文.
Log.i("RAW MESSAGE",response.body().toString());
compile 'com.squareup.retrofit2:retrofit:2.0.2'
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(BASE_URL)
.addConverterFactory(GsonConverterFactory.create())
.build();
GitApi gitApi = retrofit.create(GitApi.class);
Call<Addresses> call = gitApi.getFeed(user);
call.enqueue(new Callback<Addresses>() {
@Override
public void onResponse(Response<Addresses> response, Retrofit retrofit) {
try {
mDisplayDetails.setText(response.body().getSuburbs().get(0).getText());
**Log.i("RAW MESSAGE",response.body().toString());**
} catch (Exception e) {
mDisplayDetails.setText(e.getMessage());
}
mProgressBar.setVisibility(View.INVISIBLE);
}
@Override
public void onFailure(Throwable t) {
mDisplayDetails.setText(t.getMessage());
mProgressBar.setVisibility(View.INVISIBLE);
}
});
Run Code Online (Sandbox Code Playgroud) @POST("api/login")
Call<ApiResponse> loginUser(@Body String user);
Run Code Online (Sandbox Code Playgroud)
这里的字符串实际上是一个JSONstring即
{"email":"test@gmail.com","password":"test"}
Run Code Online (Sandbox Code Playgroud)
无法弄清楚这有什么问题.它再次转换为json的字符串.请建议..
这就是我想对我的要求做的,如图所示.
我已经多次看到这个问题并尝试了很多解决方案但是没有解决我的问题,我正在尝试使用改造在POST请求中发送json,我不是编程专家所以我可能会错过一些明显的东西.
我的JSON是一个字符串,看起来像这样:
{"id":1,"nom":"Hydrogène","slug":"hydrogene"}
Run Code Online (Sandbox Code Playgroud)
我的界面(称为APIService.java)看起来像这样:
@POST("{TableName}/{ID}/update/0.0")
Call<String> cl_updateData(@Path("TableName") String TableName, @Path("ID") String ID);
Run Code Online (Sandbox Code Playgroud)
我的ClientServiceGenerator.java看起来像这样:
public class ClientServiceGenerator{
private static OkHttpClient httpClient = new OkHttpClient();
public static <S> S createService(Class<S> serviceClass, String URL) {
Retrofit.Builder builder =
new Retrofit.Builder()
.baseUrl(URL)
.addConverterFactory(GsonConverterFactory.create());
Retrofit retrofit = builder.client(httpClient).build();
return retrofit.create(serviceClass);
}}
Run Code Online (Sandbox Code Playgroud)
最后这是我活动中的代码
APIService client = ClientServiceGenerator.createService(APIService.class, "http://mysiteexample.com/api.php/");
Call<String> call = client.cl_updateData("atomes", "1");
call.enqueue(new Callback<String>() {
@Override
public void onResponse(Response<String> response, Retrofit retrofit) {
if (response.code() == 200 && response.body() != null){ …Run Code Online (Sandbox Code Playgroud) 我需要通过改造2发送下一个json:
{
"Inspection": {
"UUID": "name",
"ModifiedTime": "2016-03-09T01:13",
"CreatedTime": "2016-03-09T01:13",
"ReviewedWith": "name2",
"Type": 1,
"Project": {
"Id": 41
},
"ActionTypes": [1]
}
}
Run Code Online (Sandbox Code Playgroud)
带标题: Authorization: access_token_value
我试过这个:
//header parameter
String accessToken = Requests.getAccessToken();
JsonObject obj = new JsonObject();
JsonObject inspection = new JsonObject();
inspection.addProperty("UUID","name");
inspection.addProperty("ModifiedTime","2016-03-09T01:13");
inspection.addProperty("CreatedTime","2016-03-09T01:13");
inspection.addProperty("ReviewedWith","name2");
inspection.addProperty("Type","1");
JsonObject project = new JsonObject();
project.addProperty("Id", 41);
inspection.add("Project", project);
obj.add("Inspection", inspection);
Retrofit restAdapter = new Retrofit.Builder()
.baseUrl(Constants.ROOT_API_URL)
.addConverterFactory(GsonConverterFactory.create())
.addConverterFactory(ScalarsConverterFactory.create())
.build();
IConstructSecureAPI service = restAdapter.create(IConstructSecureAPI.class);
Call<JsonElement> result = service.addInspection(accessToken, obj);
JsonElement element = …Run Code Online (Sandbox Code Playgroud)