-1

JSON 値の解析中に問題が発生しました。以下の JSON ファイルを見つけてください。

  {
       "Account": "xxx",
       "Account_desc": "xxx",
       "TimeZone": "GMT+05:30",
       "DeviceList": [
          {
             "Device": "xttt",
             "Device_desc": "txtx",
             "EventData": [
                {
                   "Device": "xttt",
                   "Timestamp": 1373539125,
                   "Timestamp_date": "2013/07/11",
                   "Timestamp_time": "16:08:45",
                   "StatusCode": 61715,
                   "StatusCode_hex": "0xF113",
                   "StatusCode_desc": "Stop",
                   "GPSPoint": "12.97887,77.51030",
                   "GPSPoint_lat": 12.97887,
                   "GPSPoint_lon": 77.51030,
                   "Speed": 0.0,
                   "Speed_units": "km/h",
                   "Odometer": 3.416,
                   "Odometer_units": "Km",
                   "Geozone": "zone4",
                   "Geozone_index": 0,
                   "Address": "cxcxc",
                   "DigitalInputMask": 251,
                   "DigitalInputMask_hex": "0xFB",
                   "Index": 0
                }
             ]
          },
          {
             "Device": "pppp",
             "Device_desc": "statstr",
             "EventData": [
                {
                   "Device": "pppp",
                   "Timestamp": 1368870217,
                   "Timestamp_date": "2013/05/18",
                   "Timestamp_time": "15:13:37",
                   "StatusCode": 61715,
                   "StatusCode_hex": "0xF113",
                   "StatusCode_desc": "Stop",
                   "GPSPoint": "14.26281,80.11421",
                   "GPSPoint_lat": 14.26281,
                   "GPSPoint_lon": 80.11421,
                   "Speed": 0.0,
                   "Speed_units": "km/h",
                   "Odometer": 373.874,
                   "Odometer_units": "Km",
                   "Geozone": "port",
                   "Geozone_index": 0,
                   "Address": "asdfsdfss",
                   "Index": 0
                }
             ]
          }
       ]
    }

上記の JSON から、" EventData " に "GPSPoint_lat"、"GPSPoint_lon"、"Device" のみを含めたいので、次のようにコーディングしました。

JSONObject jsonObject = ApplicationContext.getHttpService()
                    .readAsJson(s);
            // System.out.println("indexvalue:"+s.indexOf(1,5));
            // JSONObject object = jsonObject.getJSONObject("DeviceList");
            JSONArray jsonArray = jsonObject.getJSONArray("DeviceList");

            JSONObject object = jsonArray.getJSONObject(0);

            JSONArray secondarray = object.getJSONArray("EventData");

for (int i = 0; i < secondarray.length(); i++) {
                try {
                    System.out.println("Im...");
                    // System.out.println("Latitude:"+ ((JSONObject)
                    // jsonArray.get(i)).getString("GPSPoint_lat"));
                    // String id = ((JSONObject)
                    // jsonArray.get(i)).getString("deviceID");
                    // arr = (JSONArray) jsonArray.get(i);
                    JSONObject obj = secondarray.getJSONObject(i);
                    String lat = obj.getString("GPSPoint_lat");
                    String lon = obj.getString("GPSPoint_lon");

........//..
...///......}}

しかし、上記のコードの問題は、実行するたびに arraylength が 1 になることです。つまり、最初の Eventdata 値を意味する 1 つの値しか取得しません。これで必要なのは、すべての「Eventdata」値を取得したいということです。これについて私に提案してください。

よろしくプリヤ

4

7 に答える 7

0

JSON 解析には、次のクラスを使用します。

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.DefaultHttpClient;
import org.json.JSONObject;

public class JSONParser {

    public JSONParser() {

    }

    JSONObject jObj;
    String json;
    InputStream is = null;

    public JSONObject getJsonFromUrl(String url) {
        // TODO Auto-generated method stub

        try {
            DefaultHttpClient httpClient = new DefaultHttpClient();
            HttpPost httpPost = new HttpPost(url);
            HttpResponse httpResponse = httpClient.execute(httpPost);
            HttpEntity httpEntity = httpResponse.getEntity();

            is = httpEntity.getContent();
        } catch (Exception e) {
            e.printStackTrace();
        }

        try {
            BufferedReader reader = new BufferedReader(new InputStreamReader(is, "iso-8859-1"), 8);
            StringBuilder sb = new StringBuilder();
            String line = null;

            while ((line = reader.readLine()) != null) {
                sb.append(line + "\n");
            }
            is.close();
            json = sb.toString();

            System.out.println("Json String : " + json);
        } catch (Exception e) {
            e.printStackTrace();
        }

        try {
            jObj = new JSONObject(json);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return jObj;
    }
}

MainActivity では、次のコードを使用して解析します。

JSONParser parser = new JSONParser();
JSONObject o = parser.getJsonFromUrl("yourjsonurl");

String Account = o.getString("Account");
String Account_desc = o.getString("Account_desc");

JSONArray array = o.getJSONArray("DeviceList");
JSONObject o1 = array.getJSONObject(0);
String Device = o1.getString("Device");

//Again you have JSONArray
JSONArray a = o1.getJSONArray("EventData");

//Then get object form array at index 0.

JSONObject obj = a.getJSONObject(0);

次に、この json オブジェクトからデータを取得します。

于 2013-10-25T06:40:01.683 に答える
0

JSON の問題は、eventData 配列に多数のマッピングを持つ 1 つの JSON オブジェクトがあり、jsonObjects が割り当てられていないことです。EventData をすべての JSONArray にしたい場合

.."Geozone": "zone4",
                   "Geozone_index": 0,
                   "Address": "cxcxc",
                   "DigitalInputMask": 251,
                   "DigitalInputMask_hex": "0xFB",
                   "Index": 0...

JsonObject として、JSON を配列として変更する必要があります

..{"Geozone": "zone4"},
                   {"Geozone_index": 0},
                   {"Address": "cxcxc"},
                   {"DigitalInputMask": 251},
                   {"DigitalInputMask_hex": "0xFB"},
                  { "Index": 0}
...
于 2013-10-25T06:40:19.040 に答える
0
 JSONArray DeviceListArray = jsonObject.getJSONArray("DeviceList");


for (int i = 0; i < DeviceListArray.length(); i++) {

            JSONObject Deviceobject = DeviceListArray.getJSONObject(i);


            JSONArray EventDataArray = Deviceobject.getJSONArray("EventData");

for (int j= 0; j < EventDataArray.length(); j++) {


                    JSONObject valueObj = EventDataArray.getJSONObject(j);
                    String GPSPoint_lat = valueObj.getString("GPSPoint_lat");
                    String GPSPoint_lon = valueObj.getString("GPSPoint_lon");
                    String Device = valueObj.getString("Device");
     // Store this three values in ArrayList
}
}

}
于 2013-10-25T06:44:23.243 に答える
0

Priya、あなたのjsonには、次のように3つのオブジェクトと2つの配列が含まれています

オブジェクト 1. レスポンス全体 2. DeviceList 3. EventData

配列

  1. デバイス リスト - デバイスの配列を保持します
  2. イベント データ - イベントの配列

JSONにはN個のデバイスが含まれていますが、すべてのデバイスには1つのイベントがあるため、DeviceListを反復してからイベントリストを反復する必要があります。

したがって、その反復は次のようになります。

JSONObject jsonObject = ApplicationContext.getHttpService().readAsJson(s);

JSONArray jsonDeviceListArray = jsonObject.getJSONArray("DeviceList");
int deviceCount = jsonDeviceListArray.length();

JSONObject jsonDeviceObj;
JSONArray jsonEventList;
for (int deviceIndex = 0; deviceIndex < deviceCount; deviceIndex++) {
    jsonDeviceObj = jsonDeviceListArray.getJSONObject(deviceIndex);
    //Here you can print device, device_desc from jsonDeviceObj

    jsonEventList = jsonDeviceObj.getJSONArray("EventData");
    int eventCount = jsonEventList.length();

    JSONObject jsonEventObj;
    for (int eventIndex = 0; eventIndex < eventCount; eventIndex++) {
        jsonEventObj = jsonEventList.getJSONObject(eventIndex);
        //Here you can print event info.
    }
}
于 2013-10-25T06:53:49.753 に答える