Как правильно задать структуру класса для json объекта?

Добрый день!

Не могу разобраться с задачей:
Есть метод, который получает через OkHttp JSON-строку со следующей структурой:
{
   "12:30": [
     {
         name: "someName",
         lastName: "someLastName"
      },
      {
         name: "someName2",
         lastName: "someLastName2"
      }
   ],
   "13:15": [
       {
         name: "someName3",
         lastName: "someLastName3"
      },
      {
         name: "someName4",
         lastName: "someLastName4"
      }
   ]
}

Проблема в том, что в объекте может быть одно время со своими объектами или несколько как в примере выше и плюс какое будет время не известно, т.е. динамичное количество. До этого была статика, решал просто объявлением класса с необходимыми полями в соответствии с json-объектом, а вот с динамикой не могу понять.
Прошу помощи бывалых. Заранее благодарю
  • Вопрос задан
  • 160 просмотров
Решения вопроса 1
leahch
@leahch
3Д специалист. Долго, Дорого, Дерьмово.
Вот, с помощью Gson все парсится хорошо.

PS. вместо lombook.Data просто создайте геттеры/сеттеры у внутреннего класса. Мне так удобнее.

package com.mycompany;

import java.lang.reflect.Type;
import java.util.Map;
import java.util.Map.Entry;

import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;

public class ReTest {
	
	@lombok.Data
	public static class MyData {
		private String name;
		private String lastName;
	}
	
	public static void main(String[] args) {
		
		String  json = "{\n" + 
				"   \"12:30\": [\n" + 
				"     {\n" + 
				"         name: \"someName\",\n" + 
				"         lastName: \"someLastName\"\n" + 
				"      },\n" + 
				"      {\n" + 
				"         name: \"someName2\",\n" + 
				"         lastName: \"someLastName2\"\n" + 
				"      }\n" + 
				"   ],\n" + 
				"   \"13:15\": [\n" + 
				"       {\n" + 
				"         name: \"someName3\",\n" + 
				"         lastName: \"someLastName3\"\n" + 
				"      },\n" + 
				"      {\n" + 
				"         name: \"someName4\",\n" + 
				"         lastName: \"someLastName4\"\n" + 
				"      }\n" + 
				"   ]\n" + 
				"}";
		
		Gson parser = new Gson(); // create json parser
		Type type = new TypeToken<Map<String, MyData[]>>(){}.getType(); // create custom type
		Map<String, MyData[]> data = parser.fromJson(json, type); // parse data to 
 		
		for( Entry<String, MyData[]> d: data.entrySet()) {
			System.out.printf("%s\n", d.getKey());

			for(MyData e: d.getValue()) {
				System.out.printf("       %s\n", e);
			}
			System.out.println();
		}
	}
}

И вывод.
12:30
       ReTest.MyData(name=someName, lastName=someLastName)
       ReTest.MyData(name=someName2, lastName=someLastName2)

13:15
       ReTest.MyData(name=someName3, lastName=someLastName3)
       ReTest.MyData(name=someName4, lastName=someLastName4)
Ответ написан
Пригласить эксперта
Ответы на вопрос 3
AlexXYZ
@AlexXYZ
O Keep Clear O
Как вариант - всё делать массивами, а перед загрузкой JSON проверить, если объект не массив, то объявить массив и загрузить одиночный объект в него.
Если раньше было так:
{
   "12:30": {
         name: "someName",
         lastName: "someLastName"
      }
}

А теперь и так и так:
{
   "12:30": {
         name: "someName",
         lastName: "someLastName"
   },
   "13:15": [
       {
         name: "someName3",
         lastName: "someLastName3"
      },
      {
         name: "someName4",
         lastName: "someLastName4"
      }
   ]
}
, то конвертите всё в массив, а только потом применяйте:
{
   "12:30": [
   {
         name: "someName",
         lastName: "someLastName"
   },
   ],
   "13:15": [
       {
         name: "someName3",
         lastName: "someLastName3"
      },
      {
         name: "someName4",
         lastName: "someLastName4"
      }
   ]
}
Ответ написан
zagayevskiy
@zagayevskiy Куратор тега Java
Android developer at Yandex
Если есть возможность влиять на формат, то надо от такого избавляться, делать массив.
Если нет, то можно написать кастомный json adapter для gson'a или moshi.
Ответ написан
@kazsat Автор вопроса
В общем, проанализировал доступные варианты и все решения похожи на костыли. Думаю, проще изменить структуру получаемого json на следующую:
[
    [
     {
         time: "12:30",
         name: "someName",
         lastName: "someLastName"
      },
      {
        time: "12:30",
         name: "someName2",
         lastName: "someLastName2"
      }
   ],
   [
       {
        time: "13:15",
         name: "someName3",
         lastName: "someLastName3"
      },
      {
        time: "13:15",
         name: "someName4",
         lastName: "someLastName4"
      }
   ]
]

С такой структурой легко описать класс для json
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы