Я пытаюсь взять конкретный файл JSON, который динамически создается на устройстве Android, и отправлять эти данные с помощью HTTP-запросов на PHP-скрипт для хранения в текстовый файл для последующего использования. В конце концов, мне также нужно сделать так, чтобы данные сохранялись в базе данных MySQL, но я работаю один шаг за раз. Пример того, как выглядит формат файла JSON:
{"timestamp": 1351181576.64078, "name": "engine_speed", "value": 714.0} {"timestamp": 1351181576.64578, "name": "vehicle_speed", "value": 0.0} {"timestamp": 1351181576.6507802, "name": "brake_pedal_status", "value": true}
Этот файл динамически создается по строкам на Android, поэтому я не могу отправить весь файл сразу, но каждая строка по мере его создания я хочу отправить на скрипт PHP. Я написал базовое приложение для Android, которое при нажатии кнопки принимает JSONObject и отправляет его на PHP-скрипт, используя HTTP Post. Прямо сейчас я не беспокоюсь о разборе фактического файла JSON в объекты, которые нужно отправить, и просто использую два тестовых JSONObjects. PHP-скрипт получает первый объект и не помещает его в текстовый файл, но другой объект продолжает чтение как null, и я не могу понять, почему. Я относительно новичок в программировании на PHP и Android, и не уверен, правильно ли я отправляю и получаю данные. Ниже представлены сегменты моего связанного кода приложения Android:
protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); final Button button = (Button) findViewById(R.id.sendData); button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // Perform action on click Toast.makeText(MainActivity.this, "button was pressed", Toast.LENGTH_SHORT).show(); try { JSONObject json = new JSONObject(); json.put("timestamp", 1351181576.64078); json.put("name", "engine_speed"); json.put("value", 714.0); postData(json); JSONObject json2 = new JSONObject(); json.put("timestamp", 1351181576.7207818); json.put("name", "steering_wheel_angle"); json.put("value", 11.1633); postData(json2); } catch (JSONException e) { e.printStackTrace(); } } }); } public void postData(JSONObject json) throws JSONException { HttpClient httpclient = new DefaultHttpClient(); try { HttpPost httppost = new HttpPost(URL); List<NameValuePair> nvp = new ArrayList<NameValuePair>(2); nvp.add(new BasicNameValuePair("json", json.toString())); //httppost.setHeader("Content-type", "application/json"); httppost.setEntity(new UrlEncodedFormEntity(nvp)); HttpResponse response = httpclient.execute(httppost); if(response != null) { InputStream is = response.getEntity().getContent(); //input stream is response that can be shown back on android } }catch (Exception e) { e.printStackTrace(); } }
Ниже приведен код PHP для передачи данных из HTTP-сообщения и записи в текстовый файл:
<?php $filename = __DIR__.DIRECTORY_SEPARATOR."jsontest.txt"; $json = $_POST['json']; $data = json_decode($json, TRUE); if(is_null($json) == false){ file_put_contents($filename, "$json \n", FILE_APPEND); foreach ($data as $name => $value) { file_put_contents($filename, "$name -> $value \t", FILE_APPEND); } file_put_contents($filename, "\n", FILE_APPEND); } $myFile = "jsontest.txt"; $fh = fopen($myFile, 'r'); $theData = fread($fh, filesize($myFile)); fclose($fh); ?> <meta http-equiv="refresh" content="3" > <html> <!-- Displaying the data from text file, not really needed --> <p><?php echo $theData; ?></p> </html>
Прямо сейчас выходной текстовый файл выглядит так: первый объект сохраняется отлично, а второй объект отображается как null:
{"value":714,"timestamp":1.35118157664078E9,"name":"engine_speed"} value -> 714 timestamp -> 1351181576.64 name -> engine_speed {}
Ваша проблема в вашем приложении для Android:
JSONObject json = new JSONObject(); json.put("timestamp", 1351181576.64078); json.put("name", "engine_speed"); json.put("value", 714.0); postData(json); JSONObject json2 = new JSONObject(); json.put("timestamp", 1351181576.7207818); json.put("name", "steering_wheel_angle"); json.put("value", 11.1633); postData(json2);
Вы не помещаете какие-либо данные в json2
и вместо этого json2
json
. Затем вы отправляете полностью немодифицированный – и, следовательно, пустой – json2
объект в PHP, который с ошибкой выводит его как {}
.
Если вы исправите приложение Android для правильного заполнения json2
, все должно работать:
JSONObject json2 = new JSONObject(); json2.put("timestamp", 1351181576.7207818); json2.put("name", "steering_wheel_angle"); json2.put("value", 11.1633); postData(json2);