Java 字符串到JSON(android)

Java 字符串到JSON(android),java,android,json,eclipse,jsonobject,Java,Android,Json,Eclipse,Jsonobject,我陷入了一个非常棘手的境地。所以,我要做的是从本地主机数据库获取JSON对象。当我在浏览器中输入url()时,它会回显: { "nr": "1", "pav": "MANTAS" } 我已经检查了这个JSON,它似乎是有效的。此外,我几乎花了一整天的时间在StackOverflow中寻找解决方案,但没有一个有效。这是我的代码: public class MainScreenActivity extends Activity implements OnClickListene

我陷入了一个非常棘手的境地。所以,我要做的是从本地主机数据库获取JSON对象。当我在浏览器中输入url()时,它会回显:

{
    "nr": "1",
    "pav": "MANTAS"
}
我已经检查了这个JSON,它似乎是有效的。此外,我几乎花了一整天的时间在StackOverflow中寻找解决方案,但没有一个有效。这是我的代码:

  public class MainScreenActivity extends Activity implements OnClickListener             {

    EditText laukas;
    Button mygtukas;
    InputStream is = null;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main_screen);
        laukas = (EditText)findViewById(R.id.editText1);
        mygtukas = (Button)findViewById(R.id.button1);
        mygtukas.setOnClickListener(this);

    }

    @Override
    public void onClick(View v){

        String lokacija = "http://localhost./embrace/test_get.php?nr=1"; /* dont be mad about localhost, i have working adress which i've tested via pc and android browser, it's just because stackoverflow policy */

        URL url = null;
        try {
            url = new URL(lokacija);
        } catch (MalformedURLException e) {
            // TODO Auto-generated catch block
            Log.d("KLAIDA",e.toString());
        }

        HttpURLConnection conn = null;
        try {
            conn = (HttpURLConnection) url.openConnection();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            Log.d("KLAIDA",e.toString());
            }

        try {
            conn.setRequestMethod("GET");
        } catch (ProtocolException e2) {
            // TODO Auto-generated catch block
            e2.printStackTrace();
        }

        conn.setDoInput(true);

        try {
            conn.connect();
        } catch (IOException e) {
                // TODO Auto-generated catch block
            Log.d("KLAIDA",e.toString());
            }

        try {
            is = conn.getInputStream();
        } catch (IOException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        }
        String contentAsString = null;   
        try {
            contentAsString = readIt(is, 500);
            //is.close();
            if(contentAsString != null){
            //textView.setText(contentAsString);
            } //else textView.setText("nuliukas");
        } catch (UnsupportedEncodingException e) {
            // TODO Auto-generated catch block
            Log.d("KLAIDA",e.toString());
        } catch (IOException e) {
            // TODO Auto-generated catch block
            Log.d("KLAIDA",e.toString());
        }

        conn.disconnect();
            int sum = 0;
        for(int i =0;i<contentAsString.length();i++){
            if(contentAsString.charAt(i)==('"'))
                sum++;
        }


        try {
            JSONObject b = new JSONObject();
            b.getJSONObject(contentAsString); // CRASH HERE
        } catch (JSONException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        Toast.makeText(MainScreenActivity.this,sum+"",Toast.LENGTH_SHORT).show();

          }

        public String readIt(InputStream stream, int len) throws IOException, UnsupportedEncodingException {
            Reader reader = null;
            reader = new InputStreamReader(stream, "UTF-8");        
            char[] buffer = new char[len];
            reader.read(buffer);
            return new String(buffer);
        }
}
我已经试过了: 要更正接收到的字符串结尾,请删除/n标记; 为了使用稍有不同的方法,但LogCat在输入的结尾处抛出了字符0,我还尝试记录我的输出(从HTTP接收的字符串,和从浏览器接收的字符串相同(漂亮的JSON字符串)); 所以,正如你所看到的,我已经尝试了很多,但似乎每个可能的解决方案都有问题。提前感谢:)

解决了!!! 特别感谢jteezy14! 这并不像他所说的那样是个问题,但事实上他引导我走上了正确的道路。 应该是:

JSONObject b=null;


    try {
                b = new JSONObject(naujas);
            } catch (JSONException e1) {
                // TODO Auto-generated catch block
                Log.e("JSONKE",e1.toString());
            }
而不是:

JSONObject b = new JSONObject();
    try{
        b.getJSONObject(naujas);
    } catch (JSONException e1) {
      Log.e("JSONKE",e1.toString());
    }

另外,感谢Kimmax对我的答案进行格式化,使其更易于理解;)

发生这种情况的原因是,您正在readIt()函数中创建一个500个字符长的字符串。您的JSON表达式{“nr”:“1”,“pav”:“MANTAS”}是有效的,但有尾随字符使其成为无效的JSON。这就是为什么在logcat中,JSON表达式后面会有这么多问号

为了解决这个问题,您需要从JSON字符串中删除额外的字符

编辑(阅读您的评论后):

我的答案的第一部分是必要的,但您也必须以不同的方式使用JSONObject。看一下Android JSONObject的文档

您正在使用的函数期望输入值是JSON对象的键(这就是为什么您会得到一个表示没有值的错误,因为您正在指定一个不存在的键)。您需要创建传递字符串的对象,然后获取值:

JSONObject b = new JSONObject(contentAsString)
JSONObject valAtNr = b.getJSONObject("nr"); //value at nr
JSONObject valAtPav = b.getJSONObject("pav"); //value at pav

我认为您应该尝试使用GSON库为您解析JSON字符串。这是。第二个答案将提供一个很好的例子。不幸的是,它不起作用。。我删掉了这些不必要的字符。此外,还检查了“修改字符串”和“未修改字符串”的长度,它们分别为25和500。但我仍然得到错误:{“nr”:“1”,“pav”:“MANTAS”}没有值
JSONObject b = new JSONObject();
    try{
        b.getJSONObject(naujas);
    } catch (JSONException e1) {
      Log.e("JSONKE",e1.toString());
    }
JSONObject b = new JSONObject(contentAsString)
JSONObject valAtNr = b.getJSONObject("nr"); //value at nr
JSONObject valAtPav = b.getJSONObject("pav"); //value at pav