JSON: java.lang.String 类型的值无法转换为 JSONObject

JSON: Value of type java.lang.String cannot be converted to JSONObject

我正在尝试编写一个应用程序以将字符串发送到服务。我的一个朋友有接收数据的服务。

Logcat 显示此错误:"org.json.JSONException: Value FIRST of type java.lang.String cannot be converted to JSONObject"

这是我的代码:

Main Activity

public class MainActivity extends Activity {

private String URL = "String with my friend's url";
private Button btnAddValue;

String num = "1";

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    RadioGroup answer = (RadioGroup) findViewById(R.id.answer);

    answer.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {

        public void onCheckedChanged(RadioGroup group, int checkedId) {
            // TODO Auto-generated method stub

            switch (checkedId) {
                case R.id.answerA:
                    num = "1";
                    break;
                case R.id.answerB:
                    num = "2";
                    break;
                case R.id.answerC:
                    num = "3";
                    break;

            }

        }
    });

    btnAddValue = (Button) findViewById(R.id.submit);

    btnAddValue.setOnClickListener(new View.OnClickListener() {

        public void onClick(View v) {
            // TODO Auto-generated method stub

            new AddNewValue().execute(num);
        }
    });
 }

 @Override
 public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.menu_main, menu);
    return true;
}

private class AddNewValue extends AsyncTask<String, Void, Void> {

    @Override
    protected void onPreExecute() {
        super.onPreExecute();

    }

    @Override
    protected Void doInBackground(String... arg) {
        // TODO Auto-generated method stub
        String number = arg[0];

        // Preparing post params
        List<NameValuePair> params = new ArrayList<NameValuePair>();
        params.add(new BasicNameValuePair("number", number));

        ServiceHandler serviceClient = new ServiceHandler();

        String json = serviceClient.makeServiceCall(URL,
                ServiceHandler.POST, params);

        Log.d("Create Request: ", "> " + json);

        if (json != null) {
            try {
                JSONObject jsonObj = new JSONObject(json);
                boolean error = jsonObj.getBoolean("error");
                // checking for error node in json
                if (!error) {
                    // new category created successfully
                    Log.e("Value added successfully ",
                            "> " + jsonObj.getString("message"));
                } else {
                    Log.e("Add Error: ",
                            "> " + jsonObj.getString("message"));
                }

            } catch (JSONException e) {
                e.printStackTrace();
            }

        } else {
            Log.e("JSON Data", "JSON data error!");
        }
        return null;
    }

    @Override
    protected void onPostExecute(Void result) {
        super.onPostExecute(result);
    }
}

Service Handler

public class ServiceHandler {
static InputStream is = null;
static String response = null;
public final static int GET = 1;
public final static int POST = 2;

public ServiceHandler() {

}

public String makeServiceCall(String url, int method) {
    return this.makeServiceCall(url, method, null);
}


public String makeServiceCall(String url, int method,
                              List<NameValuePair> params) {
    try {

        DefaultHttpClient httpClient = new DefaultHttpClient();
        HttpEntity httpEntity = null;
        HttpResponse httpResponse = null;


        if (method == POST) {
            HttpPost httpPost = new HttpPost(url);

            if (params != null) {
                httpPost.setEntity(new UrlEncodedFormEntity(params));
            }

            httpResponse = httpClient.execute(httpPost);

        } else if (method == GET) {

            if (params != null) {
                String paramString = URLEncodedUtils
                        .format(params, "utf-8");
                url += "?" + paramString;
            }
            HttpGet httpGet = new HttpGet(url);

            httpResponse = httpClient.execute(httpGet);

        }
        httpEntity = httpResponse.getEntity();
        is = httpEntity.getContent();

    } catch (UnsupportedEncodingException e) {
        e.printStackTrace();
    } catch (ClientProtocolException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }

    try {
        BufferedReader reader = new BufferedReader(new InputStreamReader(
                is, "UTF-8"), 8);
        StringBuilder sb = new StringBuilder();
        String line = null;
        while ((line = reader.readLine()) != null) {
            sb.append(line + "\n");
        }
        is.close();
        response = sb.toString();
    } catch (Exception e) {
        Log.e("Buffer Error", "Error: " + e.toString());
    }

    return response;
}
}

我向有同样问题的其他人阅读问题。解决方案似乎是在 json String 的开头添加一个“{”,在末尾添加一个“}”,但它对我不起作用。我试着改变这个:

String json = serviceClient.makeServiceCall(URL_NEW_PREDICTION,
                ServiceHandler.POST, params);

对此:

String json = "{" + serviceClient.makeServiceCall(URL_NEW_PREDICTION,
                ServiceHandler.POST, params) + "}";

但是我得到了这个错误:

"org.json.JSONException: Expected ':' after FIRST at character 9 of {FIRST DATA New record created successfully}"

您收到的字符串无法解析为 JSON。您不能只通过添加大括号来制作 JSON,它需要遵守正确的 JSON 格式。 This site 展示了一些很好的例子来说明这意味着什么。

具体来说,解析器告诉您在 FIRST 之后有一个 space 没有引号是不行的...但是仅仅添加它并不能解决问题,问题更深比那个。