【问题标题】:Getting data with JSON from MySql从 MySql 获取 JSON 数据
【发布时间】:2012-05-05 19:22:25
【问题描述】:

我已经使用 JSON 创建了一个数据库和 php 文件:

= Connection Established - Database selected 
[{"latitude":"43222121","longitude":"2112212","description":"O masina rosie cu farurile stinse."},{"latitude":"33211322","longitude":"3211313","description":null}]

我正在使用只有一个 TextView 的 XML。 这是课程:

public class ConnectMySql extends Activity {

 TextView httpStuff;
 HttpClient client;
 JSONObject json;
 final static String URL = "http://79.114.48.119/RadarsMySql.php";

 @Override
 protected void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    httpStuff = (TextView) findViewById(R.id.tvHttp);
    client = new DefaultHttpClient();
    new Read().execute("latitude");
}


public JSONObject lastTweet(String username) throws ClientProtocolException, IOException,JSONException{
    StringBuilder url = new StringBuilder(URL);
    url.append(username);

    HttpGet get = new HttpGet(url.toString());
    HttpResponse r = client.execute(get);
    int status = r.getStatusLine().getStatusCode();
    //if(status == 200){
        HttpEntity e = r.getEntity();
        String data = EntityUtils.toString(e);
        JSONArray timeline = new JSONArray(data);
        JSONObject last = timeline.getJSONObject(0);
        return last;

    //}else{ 
        //Toast.makeText(ConnectMySql.this, "error", Toast.LENGTH_LONG);
        //return null;

    //}
}

public class Read extends AsyncTask<String, Integer, String>{

    @Override
    protected String doInBackground(String... params) {
        // TODO Auto-generated method stub
        try {
            json = lastTweet("");
            return json.getString(params[0]);
        } catch (ClientProtocolException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (JSONException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return null;
    }

    @Override
    protected void onPostExecute(String result) {
        // TODO Auto-generated method stub
        httpStuff.setText(result);
    }

}

}

我遵循了一个从 Tweeter 获取数据的教程,它可以工作,但在我的网站上却没有。

谁能帮助我,提供有用的建议,甚至更好地告诉我我做错了什么?

这是我放 Log.i-thing 后的 logcat:

05-05 19:44:07.109: W/System.err(717): org.json.JSONException: Expected literal value at character 0 of =

05-05 19:44:07.109: W/System.err(717):      

05-05 19:44:07.109: W/System.err(717):    Connection Established - Database selected[{"latitude":"43222121","longitude":"2112212","description":"O masina rosie cu farurile stinse."},{"latitude":"33211322","longitude":"3211313","description":null}]
05-05 19:44:07.109: W/System.err(717):  at org.json.JSONTokener.syntaxError(JSONTokener.java:446)
05-05 19:44:07.109: W/System.err(717):  at org.json.JSONTokener.readLiteral(JSONTokener.java:281)
05-05 19:44:07.109: W/System.err(717):  at org.json.JSONTokener.nextValue(JSONTokener.java:107)
05-05 19:44:07.109: W/System.err(717):  at org.json.JSONArray.<init>(JSONArray.java:87)
05-05 19:44:07.109: W/System.err(717):  at org.json.JSONArray.<init>(JSONArray.java:103)
05-05 19:44:07.109: W/System.err(717):  at com.project.radars.ConnectMySql.lastTweet(ConnectMySql.java:53)
05-05 19:44:07.119: W/System.err(717):  at com.project.radars.ConnectMySql$Read.doInBackground(ConnectMySql.java:71)
05-05 19:44:07.130: W/System.err(717):  at com.project.radars.ConnectMySql$Read.doInBackground(ConnectMySql.java:1)
05-05 19:44:07.130: W/System.err(717):  at android.os.AsyncTask$2.call(AsyncTask.java:185)
05-05 19:44:07.130: W/System.err(717):  at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
05-05 19:44:07.130: W/System.err(717):  at java.util.concurrent.FutureTask.run(FutureTask.java:137)
05-05 19:44:07.130: W/System.err(717):  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1068)
05-05 19:44:07.130: W/System.err(717):  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:561)
05-05 19:44:07.130: W/System.err(717):  at java.lang.Thread.run(Thread.java:1096)

【问题讨论】:

  • 不工作是不够的。说什么是错的:有错误吗?你收到意想不到的结果吗?还有什么?
  • 它在 TextView 中没有返回任何内容,不,我没有收到任何错误。
  • 这对我们来说仍然是太多的猜测。记录您收到的 json 数组,以便我们限制问题的原因。
  • 我把这个话题全部放在了项目里,我不明白你在问什么。
  • JSONArray timeline = new JSONArray(data); 我想看看这个对象的内容。执行Log.i("TAG", timeline.toString()); 并告诉我们日志中打印的内容作为数组的内容。

标签: android mysql xml database json


【解决方案1】:

你的问题来了:我已经连接到你的网站并收到了这个字符串:

= Connection Established - Database selected[{"latitude":"43222121","longitude":"2112212","description":"O masina rosie cu farurile stinse."},{"latitude":"33211322","longitude":"3211313","description":null}]

但是,您尝试在 JSONArray 中加载它,这当然会失败,因为 = Connection Established - Database selected 前缀不是任何合法 json 数组的一部分。

您需要先截断此前缀,然后才能解析数组。最好的选择是从 php 代码中删除前缀(我很确定您手动添加以记录)。但是,如果这对您来说很困难,您可以在 java 端进行。在解析json数组前添加如下一行:

String data = EntityUtils.toString(e);
data = data.substring(data.indexOf("["));

【讨论】:

  • " 方法 firstIndexOf 未定义为 String " 类型。我只能使用 indexOf 或 lastIndexOf ,我该怎么办?顺便说一句:我删除了那两个回声,现在网站开始像这样:=[...]。
  • @stangabogdan 在您发表评论时,我已经更正了我的答案。 indexOf 是您需要的。如果您更正了 php 返回,请删除数组前面的 = 符号(那么您将不需要子字符串)。
  • @stangabogdan 很抱歉回答得太晚了,但昨天我回答完就睡觉了,今天我工作了一整天。\
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-29
  • 2016-09-22
  • 2015-03-30
  • 2011-06-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多