0

私はこのようにフォーマットされたjsonファイルを持っています(実際のファイルだけに空白がありません):

{
    "main": [
        {
            "sections": [
                "sec1",
                "sec2"
            ],
            "title": "Section List 1"
        },
        {
            "sections": [
                "sec3",
                "sec4",
                "sec5"
            ],
            "title": "Section List 2"
        }
    ],
    "sections": {
        "sec1": {
            "products": [
                "prod1",
                "prod2"
            ]
        },
        "sec2": {
            "products": [
                "prod3"
            ]
        }
    },
    "products": {
        "prod1": {
            "url": "url1.gif",
            "title": "Product 1"
        },
        "prod2": {
            "url": "url2.gif",
            "title": "Product 2"
        },
        "prod3": {
            "url": "url3.gif",
            "title": "Product 3"
        }
    }
}

そのファイルのデータをJSONObjectに送信しようとすると、ロードされるJSONObjectには、トップリストの最後のオブジェクト(この場合は「製品」)のみが含まれます。今のところ、JSONObjectをロードするための私のコードは次のとおりです。

JSONObject dlResult = new JSONObject(new Scanner(cnxn.getInputStream()).nextLine());

また、最初にデータを文字列に格納してJSONObjectコンストラクターに渡し、その文字列を最初にJSONTokenerに渡し、そのトークナーをJSONObjectコンストラクターに渡してみました。StringとJSONTokenerの両方にファイル全体が含まれていますが、JSONObjectに入れられると、常に同じものになります。「main」と「sections」が切り取られ、「products」のみが残ります。

これが私の関連するコードの残りです:

public class MapsListFragment extends ListFragment
{
    private static JSONObject mDlResult;
    private ArrayAdapter<MapInfo> mMapListAdapter = null;

    private class MapInfo
    {
        private String mText;
        private String mURL;

        MapInfo(String inText, String inURL)
        {
            mText = inText;
            mURL = inURL;
        }

        public String URL()
        {
            return mURL;
        }

        @Override
        public String toString()
        {
            return mText;
        }
    }

public class MapsListUpdater extends AsyncTask<String, String, JSONObject>
    {
        private static final String URL = "http://jsonURL/products.json";

        private Date lastUpdate;

        @Override
        protected JSONObject doInBackground(String... inObjects)
        {
            Date ifModifiedSince = lastUpdate;

            try 
            {
                HttpURLConnection cnxn = (HttpURLConnection) new URL(URL).openConnection();
                if (ifModifiedSince != null)
                    cnxn.setIfModifiedSince(ifModifiedSince.getTime());

                cnxn.connect();
                if (cnxn.getResponseCode() != HttpURLConnection.HTTP_NOT_MODIFIED)
                {
                    mDlResult = new JSONObject(new Scanner(cnxn.getInputStream()).nextLine());
                }

                cnxn.disconnect();
            } 
            catch (Exception e) 
            {
                boolean check = true;
            }

            return mDlResult;
        }

        @Override
        protected void onPostExecute(JSONObject result)
        {
            super.onPostExecute(result);
            try 
            {
                // This is really ugly and brute-forcey, but it's the only way I could get JSONObjects populated with ALL the data!
                /*String[] tryThis = mDlResult.split(",\"sections\":");
                tryThis[0] += '}';
                tryThis[1] = tryThis[1].substring(0, tryThis[1].indexOf("]}},\"products\":"));
                tryThis[1] = "{\"sections\":" + tryThis[1] + "]}}}";*/

                JSONObject mainObj = mDlResult.getJSONObject("main");//new JSONObject(mDlResult);

                JSONArray mainArray = mainObj.getJSONArray("main");

                Vector<String> titles = new Vector<String>();

                mMapListAdapter.clear();

                for (int i = 0; i < mainArray.length(); i++)
                {
                    JSONObject object = mainArray.getJSONObject(i);

                    String title = object.getString("title");

                    if(!titles.contains(title))
                    {
                        titles.add(title);
                        mMapListAdapter.add(new MapInfo(object.getString("title"), null));
                    }
                }
            }
            catch (Exception e) 
            {
                boolean check = true;
            } 
        }
    }
}
4

2 に答える 2

1

今は少し馬鹿げています。結局のところ、JSONObjectは私が要求したとおりに取得していました...その中のオブジェクトのみが並べ替えられていたため、デバッガーで最初の2つのオブジェクトを確認できませんでした。

于 2013-02-11T21:12:44.740 に答える
0

それをJSONArrayに読み込んでみて、どうやって乗り込むか教えてください。

JSONArray dlResult = new JSONArray(cnxn.getInputStream());

于 2013-02-01T00:03:14.937 に答える