Динамический анализ модифицированного отклика - PullRequest
0 голосов
/ 07 октября 2018

У меня проблемы с анализом динамических модификаций.У меня есть такой ответ, и в истории отслеживания может быть много объектов, и каждый объект имеет свое имя.Я попытался создать список объектов в истории отслеживания, но так как они имеют разные имена, я не могу создать список.Как мне разобрать это?

{
"TrackingHistory": {
    "0": {
        "Activity Date": "Aug 6, 2018 14:51:00 PM",
        "Status": "Delivered  SELF MALIK"
    },
    "1": {
        "Activity Date": "Aug 6, 2018 08:08:53 AM",
        "Status": "Assign to Courier"
    },
    "2": {
        "Activity Date": "Aug 6, 2018 07:30:17 AM",
        "Status": "Inter Transfer"
    },
    "3": {
        "Activity Date": "Aug 4, 2018 19:16:54 PM",
        "Status": "Inter Transfer"
    },
    "4": {
        "Activity Date": "Aug 4, 2018 17:16:57 PM",
        "Status": "Inter Transfer"
    },
    "5": {
        "Activity Date": "Aug 4, 2018 07:40:52 AM",
        "Status": "Assign to Courier"
    },
    "6": {
        "Activity Date": "Aug 4, 2018 03:36:06 AM",
        "Status": "Inter Transfer"
    },
    "7": {
        "Activity Date": "Aug 4, 2018 02:55:39 AM",
        "Status": "Arrived at Station LAHORE"
    },
    "8": {
        "Activity Date": "Aug 2, 2018 19:19:14 PM",
        "Status": "Arrived at Station ISLAMABAD"
    },
    "9": {
        "Activity Date": "Aug 4, 2018 15:48:11 PM",
        "Status": "Posted for Consignment Booking at RAWALPINDI"
    }
}

}

Ответы [ 2 ]

0 голосов
/ 17 октября 2018

То, что я бы предложил, это то, что вы должны получить его как объект Json и разобрать его через себя.Также будьте осторожны с JsonObject, поскольку JSONObject здесь не сработает!

@Override
        public void getDetails(final String trackingNumber, String courier, String title) {
            postDetailModel = new PostDetailModel(trackingNumber, title, courier);
            final SharedPrefs sharedPrefs = new SharedPrefs(context);

            Retrofit retrofit = NetworkClient.getRetrofit();
            final RecordDetail recordDetail = retrofit.create(RecordDetail.class);

            Call<JsonObject> call = recordDetail.postRecords(sharedPrefs.getStringValue("token", null), postDetailModel);

            call.enqueue(new Callback<JsonObject>() {
                @Override
                public void onResponse(Call<JsonObject> call, Response<JsonObject> response) {
                    Log.i("Result: Running", " ");
                    arrayList = new ArrayList<>();
                    try {
                        JsonObject trackingobj = response.body();
                        JsonObject TrackingHistory = trackingobj.getAsJsonObject("TrackingHistory");
                        Log.i(TAG, "TrackRecord "+TrackingHistory.toString());


                        for(int i=0; i < TrackingHistory.size(); i++) {
                            JsonObject SingleRecord = TrackingHistory.getAsJsonObject(Integer.toString(i));
                            String ActivityDate = SingleRecord.get("Activity Date").toString();
                            String Status = SingleRecord.get("Status").toString();
                            com.couriertrackingapp.trackstack.RecordDetails.Model.TrackingHistory trackingHistory = new TrackingHistory(ActivityDate, Status);

                            arrayList.add(trackingHistory);
                        }
                        //trackingHistory_arr 2D Array with 2 Columns. 1 Column Activity Date, 2 Column Status
                    }catch(Exception e){
                        Log.i(TAG, e.toString());
                    }

                    recordDetailView.onSuccess(arrayList);
                }

                @Override
                public void onFailure(Call<JsonObject> call, Throwable t) {
                    Log.i(TAG, "onFailure: " + t.toString());
                    recordDetailView.onError();
                }
            });


        }
0 голосов
/ 07 октября 2018

Для этого вы можете попробовать использовать собственный десериализатор, который будет обрабатывать преобразование, как бы вы его ни настраивали.

Сначала вам понадобится класс для вашего внутреннего объекта, поскольку он многократно повторяется:

class Foo { //call this whatever you like
    @SerializedName("Activity Date")  // tell gson which Json field correspond to which class field
    public String activityDate;
    @SerializedName("Status")
    public String status;
}

тогда ваша история отслеживания будет выглядеть следующим образом:

public class TrackingHistory {
    public List<Foo> history;

    public TrackingHistory(List<Foo> list) {
        history = list;
    }
}

и теперь вы можете создать класс десериализатора:

public class TrackingHistoryDeserializer implements JsonDeserializer<TrackingHistory> {

    private Foo parseFoo(JsonElement element) { //this function tries to convert aJsonElement to a Foo class
        if (element.isJsonObject()) {
            JsonObject obj = element.getAsJsonObject();
            return new Gson().fromJson(obj, Foo.class);

        }
        else
            return null;
    }

    @Override
    public Card deserialize(JsonElement paramJsonElement, Type paramType,
                            JsonDeserializationContext paramJsonDeserializationContext) throws JsonParseException { 
        List<Foo> history = new ArrayList<>();
        // iterate through all objects contained in the json:
        for (Map.Entry<String,JsonElement> entry : object.entrySet()) {
            Foo foo = parseFoo(entry.getValue());  // parse the value associated to the current key
            if (foo != null)
                history.add(foo);
        }
        return new TrackingHistory(history);
    }
}

и, наконец, вам нужнодобавьте десериализатор при создании службы модернизации:

Gson gson = new GsonBuilder().registerTypeAdapter(TrackingHistory.class, new TrackingHistoryDeserializer()).create();
YourRetrofitService service = new Retrofit.Builder().client(client)
    .baseUrl(YOURENDPOINT)
    .addConverterFactory(GsonConverterFactory.create(gson))
    .addConverterFactory(ScalarsConverterFactory.create())
    .build().create(YourRetrofitService.class);

, и тогда он будет работать всякий раз, когда вы объявляете что-то подобное:

@GET("url") // or POST or whatever needed
Call<TrackingHistory> getTrackingHistory();
...