JSON имеет дополнительные цитаты и косые черты - PullRequest
0 голосов
/ 09 мая 2018

РЕДАКТИРОВАТЬ: Это не дубликат упомянутого вопроса, потому что главная проблема не в лишних косых чертах - это лишние кавычки, которые нельзя удалить с помощью одной replaceAll.

Я использую следующий код для преобразования своего ответа FCM в формат JSON:

public void onMessageReceived(RemoteMessage remoteMessage)
{
    try
    {
        Map<String, String> params = remoteMessage.getData();

        if(params != null)
        {
            JSONObject jsonObject = new JSONObject(params);
            Object notificationObject = parseJson(jsonObject.toString());

            if(notificationObject instanceof ClientRequestAcceptedModel)
           {
                Log.d(TAG, ((ClientRequestAcceptedModel) notificationObject).getFeedback());
            }
        }
    }
    catch (Exception e)
    {
        e.printStackTrace();
    }
}

Я получаю следующее:

{
    "notification_type": "request_accepted",
    "partner_information": "{\"zip\":\"24000\",\"country\":\"canada\",\"address\":\"any raw address\",\"city\":\"some-city\",\"device_meta\":{\"device_id\":\"av0384yuhyiush23768\",\"device_type\":\"android\"},\"last_name\":\"Ahmed1\",\"created_at\":\"2018-04-04 16:28:59\",\"avatar\":\"some image path\",\"partner\":1,\"password_hash\":\"yasir123\",\"last_modefied\":\"2018-04-04 16:28:59\",\"phone_number\":\"+921234567890\",\"location\":{\"latitude\":\"1234567\",\"longitude\":\"1234567\"},\"id\":2,\"first_name\":\"Yasir1\",\"email\":\"yasirahmed15@yopmail.com\",\"customer\":1,\"status\":1}",
    "feedback": "request accepted",
    "request_information": "{\"request_type\":\"custom\",\"request_quotation\":true,\"created_at\":\"2018-05-07 15:57:13\",\"media\":[{\"body\":\"base64string\",\"type\":\"image\"},{\"body\":\"base64string\",\"type\":\"video\"},{\"body\":\"base64string\",\"type\":\"audio\"}],\"schedule_date\":\"0000-00-00\",\"client_id\":2,\"pStatus\":0,\"partner_id\":2,\"schedule_time_from\":\"00:00:00\",\"updated_at\":\"0000-00-00 00:00:00\",\"schedule_time_to\":\"00:00:00\",\"skill\":{\"name\":\"Pipe Fitting\",\"id\":\"1\"},\"extra_notes\":\"some extra notes\",\"request_location\":{\"address\":\"Some raw address of the client if any\",\"latitude\":\"1234567\",\"longitude\":\"1234567\"},\"id\":23,\"status\":0}"
}

Как видите, есть тонна дополнительных \ (косых черт) и некоторых дополнительных "(цитаты) . Мне нужно использовать следующее, чтобы преобразовать его в действительный JSON :

JSONObject jsonObject = new JSONObject(params);
String modifier = jsonObject.toString().replaceAll("\\\\", "");
String modifier2 = modifier.replace("\"{\"", "{\"");
String modifier3 = modifier2.replace("}\"", "}");

Есть ли способ, как правильно сделать это? Я не могу смотреть на все JSON и искать вещи для замены / исправления.

РЕДАКТИРОВАТЬ: Вот объекты

public class ClientRequestAcceptedModel
{
    @Json(name = "feedback") private String feedback;
    @Json(name = "partner_information") private UserModel partnerInformation;
    @Json(name = "request_information") private RequestInformationModel requestInformation;
}

public class RequestInformationModel
{
    @Json(name = "id") private String id;
    @Json(name = "client_id") private String clientId;
    @Json(name = "partner_id") private String partnerId;
    @Json(name = "skill_id") private String skillId;
    @Json(name = "latitude") private String latitude;
    @Json(name = "longitude") private String longitude;
    @Json(name = "address") private String address;
    @Json(name = "request_type") private String requestType;
    @Json(name = "request_quotation") private Boolean requestQuotation;
    @Json(name = "extra_notes") private String extraNotes;
    @Json(name = "status") private String status;
    @Json(name = "created_at") private String createdAt;
    @Json(name = "updated_at") private String updatedAt;
    @Json(name = "pStatus") private String pStatus;
}

Ответы [ 2 ]

0 голосов
/ 10 мая 2018

Когда вызывается jsonAdapter.fromJson(jsonString), он преобразует все совпадающие типы автоматически, а для типов, которые не совпадают автоматически (например, String вместо вложенного JsonObject), он генерирует исключение. Поэтому вам нужно указать, как преобразовать эту строку в пользовательский тип с помощью специального адаптера.

Теперь вы сможете сделать другое самостоятельно.

    Moshi moshi = new Moshi.Builder().add(RequestInformationModel.class, new RequestInformationModelAdapter()).build();
    JsonAdapter<ClientRequestAcceptedModel> jsonAdapter = moshi.adapter(ClientRequestAcceptedModel.class);

    ClientRequestAcceptedModel clientRequestAccepted;
    try {
        clientRequestAccepted = jsonAdapter.fromJson(json);
        System.out.println(clientRequestAccepted);

    } catch (IOException e) {
        e.printStackTrace();
    }

Этот класс ниже отвечает за преобразование вложенного json в RequestInformationModel. Вы должны снова сказать moshi, в какой класс преобразовать эту строку.

    public class RequestInformationModelAdapter extends JsonAdapter<RequestInformationModel> {

        @Override
        public RequestInformationModel fromJson(JsonReader reader) throws IOException {
            Moshi moshi = new Moshi.Builder().build();
            JsonAdapter<RequestInformationModel> jsonAdapter = moshi.adapter(RequestInformationModel.class);

            return jsonAdapter.fromJson(reader.nextString());
        }

        @Override
        public void toJson(JsonWriter writer, RequestInformationModel value) throws IOException {
            Moshi moshi = new Moshi.Builder().build();
            JsonAdapter<RequestInformationModel> jsonAdapter = moshi.adapter(RequestInformationModel.class);

            writer.value(jsonAdapter.toJson(value));
        }
    }

Тебе действительно следовало сначала попытаться использовать Моши. Ваш пример в вопросе даже не использует его.

0 голосов
/ 09 мая 2018

Я никогда не использовал Moshi, но из того, что я вижу, он сериализует partner_information и request_information как String вместо JSONbject. Проверьте конфигурацию родительской модели, чтобы убедиться, что аннотации верны.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...