Отфильтруйте ответ json в соответствии с отметкой времени в kotlin

#java #android #date #kotlin #calendar

Вопрос:

Эй, у меня есть ответ json от retrofit. Я хочу отфильтровать соответственно свойству sentAt. Я хочу сравнить последнее время и переместить блок соответственно этому. Прямо сейчас в моем json есть 4 элемента/блока, но их может быть больше. Может ли кто-нибудь знать, как эффективно фильтровать список и изменять его? Также мне нужно преобразовать значение sentAt в формат времени и даты и сохранить в другой переменной. Формат сегодняшней даты будет соответствовать времени, и если дата старая, мне нужен формат даты.

Ответ Json

 {
  "conversations": [
    {
      "id": "789",
      "title": "Conversation Title 3",
      "lastMessage": {
        "id": "4677",
        "text": "Text 3",
        "sentAt": "2021-09-28T10:39:10.0492422 01:00"
      }
    },
    {
      "id": "456",
      "title": "Conversation Title 2",
      "lastMessage": {
        "id": "3c7e",
        "text": "Text2",
        "sentAt": "2021-09-26T12:39:10.0493518 01:00"
      }
    },
    {
      "id": "101",
      "title": "Conversation Title 4",
      "lastMessage": {
        "id": "f983",
        "text": "Text 4",
        "sentAt": "2021-09-30T13:39:10.0493537 01:00"
      }
    },
    {
      "id": "123",
      "title": "Conversation Title 1",
      "lastMessage": {
        "id": "f983",
        "text": "Text 1",
        "sentAt": "2021-09-26T12:38:00.0493537 01:00"
      }
    }......
  ]
}
 

ожидаемый результат

 {
  "conversations": [
    {
      "id": "101",
      "title": "Conversation Title 4",
      "lastMessage": {
        "id": "f983",
        "text": "Text 4",
        "sentAt": "2021-09-30T13:39:10.0493537 01:00"
      }
    },
    {
      "id": "789",
      "title": "Conversation Title 3",
      "lastMessage": {
        "id": "4677",
        "text": "Text 3",
        "sentAt": "2021-09-28T10:39:10.0492422 01:00"
      }
    },
    {
      "id": "456",
      "title": "Conversation Title 2",
      "lastMessage": {
        "id": "3c7e",
        "text": "Text2",
        "sentAt": "2021-09-26T12:39:10.0493518 01:00"
      }
    },
    {
      "id": "123",
      "title": "Conversation Title 1",
      "lastMessage": {
        "id": "f983",
        "text": "Text 1",
        "sentAt": "2021-09-26T12:38:00.0493537 01:00"
      }
    }......
  ]
}
 

Например, для хранения значения в переменной

 id : 101
time : 13:39

id : 789
time : 28/09/2021
 

Добавлен класс данных

Разговоры отвечают

 data class ConversationsResponse(
    val conversations: List<Conversations>? = null
)
 

Разговоры

 data class Conversations(
    val id: String? = null,
    val title: String? = null,
    val lastMessage: LastMessage? = null
)
 

Последнее сообщение

 data class LastMessage(
    val id: String? = null,
    val text: String? = null,
    val sentAt: String? = null
)
 

Комментарии:

1. Как вы обрабатываете этот ответ на Java? Используете ли вы Gson, Jackson или любую другую библиотеку или анализируете ее вручную ? Я бы сохранил полную дату, время и смещение с помощью a java.time.OffsetDateTime , потому что на самом деле он состоит из a LocalDate , a LocalTime и a ZoneOffset , и все они доступны отдельно.

2. @deHaar Я использую библиотеку моши для анализа ответа json. И как отфильтровать ответ json ?

3. Хорошо, не могли бы вы показать нам класс(ы), который вы используете для этого?

4. @deHaar ты имеешь в виду класс данных ?

5. Да, класс данных (Котлин) или Pojo (Java)

Ответ №1:

Вот пример для анализа входного времени и обработки частей даты и времени отдельно, для которого я взял один из sentAt s из вашего образца JSON:

 import java.time.LocalDate
import java.time.LocalTime
import java.time.OffsetDateTime
import java.time.format.DateTimeFormatter

fun main() {
    // example input from JSON
    val sentAt = "2021-09-28T10:39:10.0492422 01:00"
    // parse it directly, it is in ISO standard format
    val odt: OffsetDateTime = OffsetDateTime.parse(sentAt)
    // extract the date only
    val date: LocalDate = odt.toLocalDate()
    // extract the time of day
    val time: LocalTime = odt.toLocalTime()
    // format the date using a standard formatter
    val dateString = date.format(DateTimeFormatter.ISO_LOCAL_DATE)
    // and do the same for the time
    val timeString = time.format(DateTimeFormatter.ISO_LOCAL_TIME)
    // then print the formatted date and time separately
    println("date: $dateString and time: $timeString")
}
 

Результатом этого является

 date: 2021-09-28 and time: 10:39:10.0492422
 

Вы можете использовать это либо непосредственно в data class LastMessage классе утилиты, либо создать какой-либо класс утилиты, который преобразует значения даты String LastMessage и времени в s.

Можно изменить выходные данные, используя разные DateTimeFormatter s. Существует несколько встроенных модулей, и вы можете создать свой собственный форматер с помощью DateTimeFormatterBuilder или DateTimeFormatter.ofPattern(String pattern) . Вы можете передать a Locale в a DateTimeFormatter , если хотите управлять языком именованных единиц, таких как месяцы, дни недели.

Комментарии:

1. спасибо за вашу помощь. И то, что нужно отфильтровать ответ json, является моим первым приоритетом, а затем изменение sentAt-мой второй приоритет.

2. OffsetDateTime , LocalDate и LocalTime сопоставимы, вы можете сначала преобразовать String их в an OffsetDateTime , а затем, возможно, отсортировать их. Эти объекты java.time удобны для фильтрации.

3. я постараюсь их рассортировать

4. Очень хороший ответ! Стоит отметить, что современный API для определения даты и времени основан на стандарте ISO 8601 и не требует DateTimeFormatter явного использования объекта, если строка даты и времени соответствует стандартам ISO 8601.