繁体   English   中英

如何将两个单独的已解析jsonObjects合并为一个arraylist?

[英]How do I combine two separate parsed jsonObjects into a single arraylist?

我想将两个单独的已解析jsonObjects合并为一个arraylist,然后将结果显示为Strings?

我想将summaryJsonObject &segment存储在storylineData 当我使用调试器summaryJsonObjectsegment遍历代码时, summaryJsonObject都包含原始json。 原始json数据也显示在logcat中,但storylineData始终为null,并且始终不可用。

这是解析代码。

public class StorylineData {
    private static String date;
    private ArrayList<SummaryData> summary;
    private ArrayList<SegmentData> segments;
    private String caloriesIdle;
    private String lastUpdate;

    public String getDate() {
        return date;
    }

    public ArrayList<SummaryData> getSummary() {
        return summary;
    }

    public ArrayList<SegmentData> getSegments() {
        return segments;
    }

    public String getCaloriesIdle() {
        return caloriesIdle;
    }

    public String getLastUpdate() {
        return lastUpdate;
    }

    public void setDate(String date) {
        this.date = date;
    }

    public void setSummary(ArrayList<SummaryData> summary) {
        this.summary = summary;
    }

    public void setSegments(ArrayList<SegmentData> segments) {
        this.segments = segments;
    }

    public void setCaloriesIdle(String caloriesIdle) {
        this.caloriesIdle = caloriesIdle;
    }

    public void setLastUpdate(String lastUpdate) {
        this.lastUpdate = lastUpdate;
    }

    public static StorylineData parse(JSONObject jsonObject) {
        if (jsonObject != null) {
            StorylineData storylineData = new StorylineData();
            storylineData.date = jsonObject.optString("date");
            storylineData.caloriesIdle = jsonObject.optString("caloriesIdle");
            storylineData.lastUpdate = jsonObject.optString("lastUpdate");
            storylineData.summary = new ArrayList<SummaryData>();
            storylineData.segments = new ArrayList<SegmentData>();
            JSONArray summariesJsonArray= jsonObject.optJSONArray("summary");
            if (summariesJsonArray != null) {
                for (int i = 0; i < summariesJsonArray.length(); i++) {
                    JSONObject summaryJsonObject = summariesJsonArray.optJSONObject(i);
                    if (summaryJsonObject != null) {
                        storylineData.summary.add(SummaryData.parse(summaryJsonObject));
                        Log.d("storylineHandler", summaryJsonObject.toString());
                    }
                }
            }
            JSONArray segmentsJsonArray = jsonObject.optJSONArray("segments");
            if (segmentsJsonArray != null) {
                for (int i = 0; i < segmentsJsonArray.length(); i++) {
                    JSONObject segment = segmentsJsonArray.optJSONObject(i);
                    if (segment != null) {
                        storylineData.segments.add(SegmentData.parse(segment));
                        Log.d("storylineHandler", segment.toString());
                    }
                }
            }
            return storylineData;
        }
        return null;
    }
}

MainActivity看起来像这样: MainActivity

public class MainActivity extends FragmentActivity implements OnClickListener{
    ..other variables here..

List<StorylineData> storylineData;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

...other ui elements here...

        mEditTextResponse = (TextView) findViewById(R.id.editResponse);
    storylineData = new StorylineData();


MovesAPI.init(this, CLIENT_ID, CLIENT_SECRET, CLIENT_SCOPES.....
    @Override
    public void onClick(View v) {
        toggleProgress(true);
        switch (mSpinnerAPI.getSelectedItemPosition()) {

... other cases here...
            break;
...other cases here...

        case 4: // Get Summary Day
            MovesAPI.getSummary_SingleDay(summaryHandler, "20150418", null);//Date changed to "20150117"
            break;



 Other cases here..
            case 10: // Get Storyline Day
                MovesAPI.getStoryline_SingleDay(storylineHandler, "20150418", null, false);//Date changed to "20150418"
                break;

  ...Other cases here..

    }

}

...   Other MovesHandlers here...

   private JSONObject summaryJsonObject;
    private List<StorylineData> storylineList;
    private JSONObject summariesJsonArray;

private MovesHandler<ArrayList<StorylineData>> storylineHandler = new MovesHandler<ArrayList<StorylineData>>() {
@Override
        public void onSuccess(ArrayList<StorylineData> result) {

        toggleProgress(false);

        storylineList = (List<StorylineData>) StorylineData.parse(summaryJsonObject);

            updateResponse( + storylineData.toString() + "\n" //displays true to layout view
                 result.add(StorylineData.parse(summariesJsonArray))+ "\n"
+Log.d("call result", result.toString()) + "\n" //displays 60 in layout view & com.protogeo.moves.demos.apps.storyline.StorylineData@52824f88, null]
                + Log.d("Log.d storylineHandler", storylineHandler.toString()) + "\n"  ); //returns 78 in layout view  & com.protogeo.moves.demos.apps.Mainactivity@234234 to log cat


            onFailure code here..

    }
};

public void toggleProgress(final boolean isProgrressing) {

 togglePregress code here..
}

public void updateResponse(final String message) {
    runOnUiThread(new Runnable() {

        public List<StorylineData> storylineList;

        @Override
        public void run() {
            mEditTextResponse.setText(message);

  if (storylineData!= null) {
                for (StorylineData storylineData : storylineList) {
                    mEditTextResponse.append(("storylineData" + storylineData.toString()));
                }
}

        }
    });
}


 }

HttpClass

public static void getDailyStorylineList(final MovesHandler<JSONArray> handler,
                                             final String specificSummary,
                                             final String from,
                                             final String to,
                                             final String pastDays,
                                             final String updatedSince,
                                             final boolean needTrackPoints) {
        new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    /* Refresh access token if only AuthData.MOVES_REFRESHBEFORE days are there to expire current token */
                    AuthData.refreshAccessTokenIfNeeded();

                    /* Exchange the authorization code we obtained after login to get access token */
                    HashMap<String, String> nameValuePairs = new HashMap<String, String>();
                    nameValuePairs.put("access_token", AuthData.getAuthData().getAccessToken());

                   // if (specificSummary != null && specificSummary.length() > 0) nameValuePairs.put("specificSummary", specificSummary);//att

                    if (from != null && from.length() > 0) nameValuePairs.put("from", from);
                    if (to != null && to.length() > 0) nameValuePairs.put("to", to);
                    if (pastDays != null && pastDays.length() > 0) nameValuePairs.put("pastDays", pastDays);
                    if (updatedSince != null && updatedSince.length() > 0) nameValuePairs.put("updatedSince", updatedSince);
                    if (needTrackPoints) nameValuePairs.put("trackPoints", "true");


                    URL url     = new URL(MovesAPI.API_BASE + MovesAPI.API_PATH_STORYLINE + (specificSummary != null ? specificSummary : "") + "?" + Utilities.encodeUrl(nameValuePairs));
                    HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
                    urlConnection.setRequestMethod("GET");
                    urlConnection.setDoInput(true);
                    urlConnection.connect();

                    if (urlConnection.getResponseCode() != 200) {
                        /* All other HTTP errors from Moves will fall here */
                        handler.onFailure(getErrorStatus(Utilities.readStream(urlConnection.getErrorStream()), urlConnection.getResponseCode()), "Server not responded with success ("+ urlConnection.getResponseCode() +")");
                        return;
                    }

                    String response = Utilities.readStream(urlConnection.getInputStream());
                    Object object = new JSONTokener(response).nextValue();
                    if (object instanceof JSONArray) {
                        JSONArray jsonArray = (JSONArray) object;
                        ArrayList<StorylineData> storylineData = new ArrayList<StorylineData>();
                        if (jsonArray != null) {
                            for (int i = 0; i < jsonArray.length(); i++) {
                                JSONObject storylineJsonObject = jsonArray.optJSONObject(i);
                                if (storylineJsonObject != null) {
                                    storylineData.add(StorylineData.parse(storylineJsonObject));
                                }
                            }
                        }
                        handler.onSuccess(storylineData);
                    } else {
                        handler.onFailure(MovesStatus.INVALID_RESPONSE, "Expected a JSONArray from server, but failed");
                    }

                } catch (Exception ex) {
                    ex.printStackTrace();
                    handler.onFailure(MovesStatus.UNEXPECTED_ERROR, "An unexpected error occured, please check logcat");
                }
          }
        }).start();
    }

MovesHandler

public interface MovesHandler<T> {//T stands for generic type

    /**
     * Implement this method to get success notifications along with the result
     * @param result : Result of the operation completed with this handler
     */
    public void onSuccess(ProfileData result);

    /**
     * Implement this method to get failure notifications along with the {@link MovesStatus} code and a brief message
     * @param status : Status code of the failure
     * @param message : A brief message about the reason behind failure
     */
    public void onFailure(MovesStatus status, String message);
}

如果你想有一个ArrayList同时存储SummaryDataSegmentData ,你可以只创建的对象的一个ArrayList ArrayList<Object> 这将是更通用的解决方案。

另一种选择是让SummaryDataSegmentData继承相同的类或实现相同的接口。

使用扩展类,您可能会:

class Data {
}

class SegmentData extends Data {
}

class SummaryData extends Data {
}

然后,您可以拥有一个ArrayList,该数组可以添加SegmentDataSummaryData对象。

如果您想将每个项目显示为字符串,则需要遍历列表并调用每个项目的toString()函数

ArrayList<Data> dataList;
for (Data d : dataList) {
    Log.d("data", d.toString())
} 

只要确保覆盖SegmentDataSummaryDatatoString()函数SummaryData

编辑:显示如何打印JsonArray

如果您只想打印JsonArrays,则可以:

public class StorylineData {
    private static String date;
    private JSONArray summary;
    private JSONArray segments;
    private String caloriesIdle;
    private String lastUpdate;

    public String getDate() {
        return date;
    }

    public JSONArray getSummary() {
        return summary;
    }

    public JSONArray getSegments() {
        return segments;
    }

    public String getCaloriesIdle() {
        return caloriesIdle;
    }

    public String getLastUpdate() {
        return lastUpdate;
    }

    public void setDate(String date) {
        this.date = date;
    }

    public void setSummary(JSONArray summary) {
        this.summary = summary;
    }

    public void setSegments(JSONArray segments) {
        this.segments = segments;
    }

    public void setCaloriesIdle(String caloriesIdle) {
        this.caloriesIdle = caloriesIdle;
    }

    public void setLastUpdate(String lastUpdate) {
        this.lastUpdate = lastUpdate;
    }

    public static StorylineData parse(JSONObject jsonObject) {
        if (jsonObject != null) {
            StorylineData storylineData = new StorylineData();
            storylineData.date = jsonObject.optString("date");
            storylineData.caloriesIdle = jsonObject.optString("caloriesIdle");
            storylineData.lastUpdate = jsonObject.optString("lastUpdate");
            storylineData.summary = jsonObject.optJSONArray("summary");
            storylineData.segments = jsonObject.optJSONArray("segments");
            return storylineData;
        }
        return null;
    }

    @Override
    public String toString() {
        JSONArray combined = new JSONArray(summary);
        combined.put(segment);
        return combined.toString();
    }
}

在您的MainActivity中

private StorylineData storylineData;

private MovesHandler<JSONArray> storylineHandler = new MovesHandler<JSONArray>() {
    @Override
    public void onSuccess(JSONArray result) {
        toggleProgress(false);
        storylineData = StorylineData.parse(summaryJsonObject);

        updateResponse(storylineData.toString()) //displays true to layout view
        result.add(storylineData.getSummary());
        Log.d("call result", result.toString());
        Log.d("Log.d storylineHandler", storylineHandler.toString()); 
    }
};

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM