【问题标题】:use Jsonreader setLenient(true) to accept malformed JSON error使用 Jsonreader setLenient(true) 接受格式错误的 JSON 错误
【发布时间】:2017-09-03 08:51:45
【问题描述】:

我试图解决这个错误,但我不能。

主要活动代码

public class Reservation_main extends AppCompatActivity {
final String TAG = "ReservationMainActivity";
public static final String url = "http://10.0.2.2:81/PhpProject1/room.php";
RecyclerView recycle;


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_reserve_main);
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);

    recycle = (RecyclerView)findViewById(R.id.recycle);
    recycle.setHasFixedSize(true);

    LinearLayoutManager manager = new LinearLayoutManager(this);

    recycle.setLayoutManager(manager);

    StringRequest stringRequest = new StringRequest(Request.Method.POST, url, new Response.Listener<String>() {
                @Override
                public void onResponse(String response) {
                    Log.d(TAG, response);

                    ArrayList<Reservation_room_list> roomList = new JsonConverter<Reservation_room_list>()
                            .toArrayList(response, Reservation_room_list.class);

                    Reservation_room_adapter adapter = new Reservation_room_adapter(getApplicationContext(), roomList);

                    recycle.setAdapter(adapter);

                }
            },
            new Response.ErrorListener() {
                @Override
                public void onErrorResponse(VolleyError error) {
                    if(error != null){
                        Log.d(TAG, error.toString());
                        Toast.makeText(getApplicationContext(), "Something went wrong.", Toast.LENGTH_LONG).show();
                    }
                }
            }
    );

    MySingleton.getInstance(getApplicationContext()).addToRequestQueue(stringRequest);


}
}

房间适配器

public class Reservation_room_adapter extends 
RecyclerView.Adapter<Reservation_room_adapter.RoomViewHolder> {

private Context context;
private ArrayList<Reservation_room_list> room;

public Reservation_room_adapter(Context context, ArrayList<Reservation_room_list> room){
    this.context = context;
    this.room = room;
}

@Override
public RoomViewHolder onCreateViewHolder (ViewGroup parent, int type){
    LayoutInflater inflater = LayoutInflater.from(parent.getContext());
    View view = inflater.from(parent.getContext())
            .inflate(R.layout.activity_reserve_layout, parent, false);

    RoomViewHolder roomViewHolder = new RoomViewHolder(view);
    return roomViewHolder;
}

@Override
public void onBindViewHolder (RoomViewHolder holder, int position){
    Reservation_room_list rooms = room.get(position);
    holder.roomNo.setText(rooms.roomid);
    holder.price.setText("" + rooms.price);
    holder.roomDescription.setText(rooms.type);

    String fullUrl = "http://10.0.2.2:81/PhpProject1/" + rooms.image;

    Picasso.with(context)
            .load(fullUrl)
            .placeholder(R.drawable.bed_room_web)
            .error(android.R.drawable.stat_notify_error)
            .into(holder.roomImage);
}

@Override
public int getItemCount(){
    if (room != null){
        return room.size();
    }
    return 0;
}

public static class RoomViewHolder extends RecyclerView.ViewHolder{
    public CardView info;
    public TextView roomNo;
    public TextView roomDescription;
    public TextView price;
    public ImageView roomImage;

    public RoomViewHolder(View roomView){
        super(roomView);
        info = (CardView) roomView.findViewById(R.id.view);
        roomNo = (TextView) roomView.findViewById(R.id.room);
        roomDescription = (TextView) roomView.findViewById(R.id.details);
        price = (TextView) roomView.findViewById(R.id.price);
        roomImage = (ImageView) roomView.findViewById(R.id.imageView2);
    }
}

}

这是 room_list 代码

public class Reservation_room_list implements Serializable{
public String type;
public String image;
public String status;
public int roomid;
public int capacity;
public double price;
}

php代码

<?php
 error_reporting(0);
  require 'index.php';

 $query = "SELECT * FROM `room` WHERE Status = 'available' ORDER BY 
  Room_number desc";
  $response["sucsess"] = false;

$result = mysqli_query($conn, $query);

while($row = mysqli_fetch_assoc($result)){
    $response["success"] = true;
        $data[] = $row;
}

echo json_encode($data);

?>

MySingleton 代码

public class MySingleton {
private static MySingleton mInstance;
private RequestQueue mRequestQueue;
private ImageLoader mImageLoader;
private static Context mCtx;

private MySingleton(Context context) {
    mCtx = context;
    mRequestQueue = getRequestQueue();

    mImageLoader = new ImageLoader(mRequestQueue,
            new ImageLoader.ImageCache() {
                private final LruCache<String, Bitmap>
                        cache = new LruCache<String, Bitmap>(20);

                @Override
                public Bitmap getBitmap(String url) {
                    return cache.get(url);
                }

                @Override
                public void putBitmap(String url, Bitmap bitmap) {
                    cache.put(url, bitmap);
                }
            });
}

public static synchronized MySingleton getInstance(Context context) {
    if (mInstance == null) {
        mInstance = new MySingleton(context);
    }
    return mInstance;
}

public RequestQueue getRequestQueue() {
    if (mRequestQueue == null) {
        mRequestQueue = 
    Volley.newRequestQueue(mCtx.getApplicationContext());
    }
    return mRequestQueue;
}

public <T> void addToRequestQueue(Request<T> req) {
    getRequestQueue().add(req);
}

public ImageLoader getImageLoader() {
    return mImageLoader;
}
}

运行时出现错误

09-03 07:45:34.436 6020-6020/fyp.hotelreservationsystemver2 E/RecyclerView:未连接适配器;跳过布局 09-03 07:45:34.465 6020-6020/fyp.hotelreservationsystemver2 D/ReservationMainActivity: [{"Room_number":"1","Type":"luxury","Capacity":"10","Status":"可用","价格":"1000","图片":"img/hotel-bedroom-decor-hotel-style-bedrooms.jpg"}]/* * 要更改此许可标头,请在项目属性中选择许可标头。 * 要更改此模板文件,请选择工具 |模板 * 并在编辑器中打开模板。 */ 09-03 07:45:34.504 6020-6020/fyp.hotelreservationsystemver2 D/AndroidRuntime: 关闭虚拟机 09-03 07:45:34.504 6020-6020/fyp.hotelreservationsystemver2 E/AndroidRuntime: 致命异常: main 进程:fyp.hotelreservationsystemver2,PID:6020 com.google.gson.JsonSyntaxException: com.google.gson.stream.MalformedJsonException: 使用 JsonReader.setLenient(true) 在第 2 行第 151 列接受格式错误的 JSON 在 com.google.gson.Gson.assertFullConsumption(Gson.java:779) 在 com.google.gson.Gson.fromJson(Gson.java:769) 在 com.google.gson.Gson.fromJson(Gson.java:717) 在 com.kosalgeek.android.json.JsonConverter.toArrayList(JsonConverter.java:42) 在 fyp.hotelreservationsystemver2.Reservation_main$1.onResponse(Reservation_main.java:53) 在 fyp.hotelreservationsystemver2.Reservation_main$1.onResponse(Reservation_main.java:44) 在 com.android.volley.toolbox.StringRequest.deliverResponse(StringRequest.java:60) 在 com.android.volley.toolbox.StringRequest.deliverResponse(StringRequest.java:30) 在 com.android.volley.ExecutorDelivery$ResponseDeliveryRunnable.run(ExecutorDelivery.java:99) 在 android.os.Handler.handleCallback(Handler.java:751) 在 android.os.Handler.dispatchMessage(Handler.java:95) 在 android.os.Looper.loop(Looper.java:154) 在 android.app.ActivityThread.main(ActivityThread.java:6077) 在 java.lang.reflect.Method.invoke(本机方法) 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:866) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:756) 引起:com.google.gson.stream.MalformedJsonException:使用 JsonReader.setLenient(true) 在第 2 行第 151 列接受格式错误的 JSON 在 com.google.gson.stream.JsonReader.syntaxError(JsonReader.java:1505) 在 com.google.gson.stream.JsonReader.checkLenient(JsonReader.java:1386) 在 com.google.gson.stream.JsonReader.nextNonWhitespace(JsonReader.java:1336) 在 com.google.gson.stream.JsonReader.doPeek(JsonReader.java:527) 在 com.google.gson.stream.JsonReader.peek(JsonReader.java:414) 在 com.google.gson.Gson.assertFullConsumption(Gson.java:775) 在 com.google.gson.Gson.fromJson(Gson.java:769) 在 com.google.gson.Gson.fromJson(Gson.java:717) 在 com.kosalgeek.android.json.JsonConverter.toArrayList(JsonConverter.java:42) 在 fyp.hotelreservationsystemver2.Reservation_main$1.onResponse(Reservation_main.java:53) 在 fyp.hotelreservationsystemver2.Reservation_main$1.onResponse(Reservation_main.java:44) 在 com.android.volley.toolbox.StringRequest.deliverResponse(StringRequest.java:60) 在 com.android.volley.toolbox.StringRequest.deliverResponse(StringRequest.java:30) 在 com.android.volley.ExecutorDelivery$ResponseDeliveryRunnable.run(ExecutorDelivery.java:99) 在 android.os.Handler.handleCallback(Handler.java:751) 在 android.os.Handler.dispatchMessage(Handler.java:95) 在 android.os.Looper.loop(Looper.java:154) 在 android.app.ActivityThread.main(ActivityThread.java:6077) 在 java.lang.reflect.Method.invoke(本机方法) 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:866) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:756)

我使用的 gson 和 JSON 转换器:

[1]: https://drive.google.com/open?id=0B9c7Ta0Lo2OVVkkyU1RJVzQ5bTQ

【问题讨论】:

  • 发布你的 json 字符串
  • 我建议 1) 打开 Web 浏览器并转到 room.php 页面 2) 将响应设置为仅 TextView 并查看它。如果它看起来像 JSON,则解析它

标签: java android gson


【解决方案1】:

[{"Room_number":"1","Type":"luxury","Capacity":"10","Status":"available","Price":"1000","Image":" img/hotel-bedroom-decor-hotel-style-bedrooms.jpg"}]/* * 要更改此许可标头,请在项目属性中选择许可标头。 * 要更改此模板文件,请选择工具 |模板 * 并在编辑器中打开模板。 */

似乎是响应,简单地说,以某种方式附加到响应的注释块使响应无效 json。由于文本没有出现在给定的代码中,它必须来自应用程序的其他地方。由于响应错误,因此错误必须在 PHP 代码中。

【讨论】:

    猜你喜欢
    • 2019-11-22
    • 2014-03-11
    • 2017-06-03
    • 1970-01-01
    • 2018-05-17
    • 2018-06-24
    • 2017-02-16
    • 2018-08-25
    • 1970-01-01
    相关资源
    最近更新 更多