【问题标题】:How to send JSON data as Body using Retrofit android如何使用 Retrofit android 将 JSON 数据作为正文发送
【发布时间】:2015-09-25 05:59:59
【问题描述】:

我正在尝试在服务器上的 JSON 数组下方发布。

{
    "order": [{
            "orderid": "39",
            "dishid": "54",
            "quantity": "4",
            "userid":"2"
        },{
            "orderid": "39",
            "dishid": "54",
            "quantity": "4",
            "userid":"2"
        }]

}

我在下面使用这个:

private void updateOreder() {

    M.showLoadingDialog(GetDishies.this);
    UpdateAPI mCommentsAPI = APIService.createService(UpdateAPI.class);

    mCommentsAPI.updateorder(jsonObject, new Callback<String>() {
        @Override
        public void success(String s, Response response) {
            M.hideLoadingDialog();
            Log.e("ssss",s.toString());
            Log.e("ssss", response.getReason());
        }

        @Override
        public void failure(RetrofitError error) {
            M.hideLoadingDialog();
            Log.e("error",error.toString());
        }

    });

}

我遇到以下错误:

 retrofit.RetrofitError: com.google.gson.JsonSyntaxException: com.google.gson.stream.MalformedJsonException: Use JsonReader.setLenient(true) to accept malformed JSON at line 2 column 6 path $

更新API代码:

@POST("updateorder.php")
    void updateorder(@Body JSONObject object,Callback<String>());

谁能告诉我我的错误?

提前致谢

【问题讨论】:

  • 尝试激活跟踪以查看越界的内容。很有可能,问题出在服务器的答案中。
  • @Henry 感谢您的回答。这里没有什么可追踪的。它不会向服务器发送数据。
  • 请同时发布您的 UpdateAPI 代码。

标签: android json gson retrofit


【解决方案1】:

创建订单请求类

public class OrderRequest {

@SerializedName("order")
public List<Order> orders;
}

创建订单类

    public class Order {

    @SerializedName("orderid")
    public String Id;
}

端点

public interface ApiEndpoint{
  @POST("order")
  Call<String> createOrder(@Body OrderRequest order, @HeaderMap HashMap<String,String> headerMap);
}

在调用服务的mainActivity中使用这种类型的实现

HashMap hashMap= new HashMap();
    hashMap.put("Content-Type","application/json;charset=UTF-8");

OrderRequest orderRequest = new OrderRequest();
List<Orders> orderList = new ArrayList();

Orders order = new Order();
order.Id = "20";
orderList.add(order);
//you can add many objects

orderRequest.orders = orderList;

Call<String> dataResponse= apiEndPoint.createOrder(orderRequest,hashMap)
dataResponse.enqueue(new Callback<String>() {
        @Override
        public void onResponse(Call<String> call, Response<String> response) {
            try{

            }catch (Exception e){

            }
        }   

在 createOrder 方法中,我们不需要将对象转换为 Json。因为当我们构建改造时,我们将转换器工厂添加为 GsonConverterFactory。它会自动将该对象转换为 JSON

 retrofit = new Retrofit.Builder()
                .baseUrl(BASE_URL)
                .addConverterFactory(GsonConverterFactory.create())
                .build();

【讨论】:

    【解决方案2】:

    尝试将您的代码修改为 Retrofit 2

    compile 'com.squareup.retrofit2:retrofit:2.0.0'
    compile 'com.squareup.retrofit2:converter-gson:2.0.0'
    

    您的服务:

    @POST("updateorder.php")
    Call<String> updateorder(@Body JsonObject object);
    

    调用改造

    Retrofit retrofit = new Retrofit.Builder()
            .baseUrl(RetrofitService.baseUrl)
            .addConverterFactory(GsonConverterFactory.create())
            .build();
    

    使用 GSON 传递您的 Json:

    JsonObject postParam = new JsonObject
    postParam.addProperty("order",yourArray) ;
    

    最后:

    Call<String> call = retrofitService.updateorder(postParam);
    
    
        call.enqueue(new Callback<String>() {
             @Override
             public void onResponse(Call<String>callback,Response<String>response) {
                String res = response.body();
             }
                @Override
                public void onFailure(Call<String> call, Throwable t) {
    
                }
        });
    

    希望对你有所帮助。

    【讨论】:

      【解决方案3】:
      If you want to post a JSON request using Retrofit then there are two methods to follow.
      
      1. Option one - Seraialized Object
      Create a serializable object(In simple terms convert your JSON object into a class) and post it using Retrofit.
      If you don't know how to do it use this URL to 
      

      将您的 JSON 对象转换为 jsonschema2pojo

      Example : Lets say in your case JSon object class name is Order. 
      

      然后你必须在类中定义与 JSon 结构匹配的变量。(由 [] 定义的内部块是一个对象数组)。而且你必须定义 getter 和 setter(我没有在此处包含它们以节省间距)

      public class Order implements Serializable{
      private List<Order> order = null; //Include getters and setters
      }
      
      2. Option Two - Raw json (I prefer this one)
      Create a JsonObject object and pass it (Remember not a JSONObject. Though both appears to be the same there is a distinct difference between them. Use exact same characters)
      
      JsonObject bodyParameters = new JsonObject();
      JsonArray details= new JsonArray();
      JsonObject orderData= new JsonObject();
      orderData.addProperty("orderid", "39");//You can parameterize these values by passing them
      orderData.addProperty("dishid", "54");
      orderData.addProperty("quantity", "4");
      orderData.addProperty("userid", "2");
      details.add(orderData)
      bodyParameters.add("order", details);
      
      Create Retrofit instance
      retrofit = new Retrofit.Builder()
                          .baseUrl(baseURL)
                          .addConverterFactory(GsonConverterFactory.create())
                          .client(okHttpClient)
                          .build();
      
      Retrofit Service(You have to create a service class and define instance)
      @POST("<Your end point>")
      Call<ResponseObject> updateOrder(@Body JsonObject bodyParameters);
      
      Request Call
      Call<ResponseObject> call = postsService.updateOrder(bodyParameters);
      //postsService is the instance name of your Retrofit Service class
      

      【讨论】:

        【解决方案4】:

        使用改造版本 2

        compile 'com.squareup.retrofit2:retrofit:2.0.0'
        compile 'com.squareup.retrofit:converter-gson:2.0.0-beta2'
        
        1. 创建与您将发送到服务器的 JSON 结构相对应的 POJO 类:

           public class RequestBody {
                private List<InnerClass> order;
          
                public RequestBody(List<InnerClass> order) {
                   this.order = order;
                }
          
                public class InnerClass{
                     private int orderid, dishid, quantity, userid;
          
                     public InnerClass(int orderid, int dishid, int quantity, int userid) {
                       this.orderid = orderid;
                       this.dishid = dishid;
                       this.quantity = quantity;
                       this.userid = userid;
                   }
                   public int getOrderId() { return orderid; }
                   public int getDishId() { return dishid; }
                   public int getQuantity() { return quantity; }
                   public int getUserId() { return userid; }
                }
           }
          
          1. 创建一个服务生成器类来初始化你的 Retrofic 对象实例:

             public class ServiceGenerator {
            
              private static OkHttpClient okHttpClient = new OkHttpClient();
            
               public static <S> S createService(Class<S> serviceClass) {
               Retrofit.Builder builder = new Retrofit.Builder()
                                       .baseUrl(AppConfig.BASE_URL)
                                         .addConverterFactory(GsonConverterFactory.create());
              Retrofit retrofit = builder.client(okHttpClient).build();
            
              return retrofit.create(serviceClass);
            }
            
        2. 创建应该包含“updateorder”方法的api服务接口:

          public interface ApiService {
              @POST("updateorder.php")
              Call<your POJO class that corresponds to your server response data> updateorder(@Body RequestBody object);
          }
          

        4.在您的 Activity 或 Fragment 中,您希望在其中填写您的 Json 数据并初始化 ApiService:

        ArrayList<RequestBody.InnerClass> list = new List<>();
        list.add(new RequestBody.InnerClass(39, 54, 4, 2));
        list.add(new RequestBody.InnerClass(39, 54, 4, 2));
        RequestBody requestBody = new RequestBody(list);
        
             ApiService apiService =    ServiceGenerator.createService(ApiService.class);
           Call<your POJO class that corresponds to your server response data> call = apiService.updateorder(requestBody);
        //use enqueue for asynchronous requests 
        call.enqueue(new Callback<your POJO class that corresponds to your server response data>() {
        
           public void onResponse(Response<> response, Retrofit retrofit) {
                 M.hideLoadingDialog();
                Log.e("ssss",s.toString());
                Log.e("ssss", response.getReason());
           }
        
           public void onFailure(Throwable t) {
                   M.hideLoadingDialog();
                   Log.e("error",t.toString());
                }
        }
        

        【讨论】:

          猜你喜欢
          • 2020-11-11
          • 1970-01-01
          • 2018-06-04
          • 1970-01-01
          • 2019-04-26
          • 2013-10-06
          • 2019-11-25
          • 2021-02-11
          • 2017-10-31
          相关资源
          最近更新 更多