【问题标题】:JSON: Value of type java.lang.String cannot be converted to JSONObjectJSON:java.lang.String 类型的值无法转换为 JSONObject
【发布时间】:2015-02-18 01:16:05
【问题描述】:

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

Logcat 显示这个错误:“org.json.JSONException: Value FIRST of type java.lang.String cannot be convert to JSONObject”

这是我的代码:

主要活动

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);
    }
}

服务处理程序

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 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 吗?

标签: java android json post


【解决方案1】:

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

具体来说,解析器告诉您在 FIRST 之后有一个空格如果没有引号是不行的……但只是添加它并不能解决问题,问题比这更深。

【讨论】:

  • 谢谢,但我不明白...我不想接收任何东西,我只是发送 =/
  • 你发送成功了,但是当你使用 makeServiceCall 时,它会从服务器返回响应——也就是那个字符串。
猜你喜欢
  • 2012-05-03
  • 2013-12-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-19
相关资源
最近更新 更多