Пользовательский сериализатор Gson с полями, которые неизвестны во время выполнения - PullRequest
0 голосов
/ 21 февраля 2019

Я пытаюсь выполнить пользовательскую сериализацию Gson, чтобы создать объект Json для отправки в службу, за исключением некоторых полей, которые неизвестны во время выполнения.

json, который я хочу создать, должен выглядеть примерно так:

{
    "type": "configuration/entityTypes/HCP",
    "attributes": {
        "FirstName": [
            {
                "type": "configuration/entityTypes/HCP/attributes/FirstName",
                "value": "Michael"
            }
        ]

    },
    "crosswalks": [
        {
            "type": "configuration/sources/AMA",
            "value": "10000012"
        }
    ]
}

Я могу успешно создать этот json с помощью Gson, но проблема в том, что у меня есть тысячи полей, которые могутнаходиться под объектом атрибутов, в этом примере есть только FirstName, но если бы я делал создание, было бы столько атрибутов, сколько этот человек, место или вещь связали с ними.

Потому что в настоящее время я могу создать это с помощью Gson, имея 4 разных класса:

  1. Тип
  2. Атрибуты
  3. Имя_провода
  4. Crosswalks

Но я хочу иметь возможность иметь FirstName, LastName, MiddleName и т. Д. Все под объектом атрибутов, не создавая отдельный класс Java для всех них.В этом случае json будет выглядеть следующим образом:

{
    "type": "configuration/entityTypes/HCP",
    "attributes": {
        "FirstName": [
            {
                "type": "configuration/entityTypes/HCP/attributes/FirstName",
                "value": "Doe"
            }
        ],
        "LastName": [
            {
                "type": "configuration/entityTypes/HCP/attributes/LastName",
                "value": "John"
            }
        ],
        "MiddleName": [
            {
                "type": "configuration/entityTypes/HCP/attributes/MiddleName",
                "value": "Michael"
            }
        ]

    },
    "crosswalks": [
        {
            "type": "configuration/sources/AMA",
            "value": "10000012"
        }
    ]
}

Есть ли способ использовать Gson для создания объекта атрибутов без создания объектов Java для всех различных имеющихся у меня атрибутов?

1 Ответ

0 голосов
/ 21 февраля 2019

Вы можете использовать Map<String, Object>, где Object будет массивом из одного элемента.См., Например, ниже модель:

class Attributes {

    private Map<String, Object> attributes;

    // getters, setters
}

class Type {

    private final String type;
    private final String value;

    public Type(String type, String value) {
        this.type = type;
        this.value = value;
    }

    // getters
}

Теперь давайте построим attributes вручную:

import com.google.gson.Gson;

import java.util.Collections;
import java.util.HashMap;
import java.util.Map;

public class GsonApp {

    public static void main(String[] args) {
        Map<String, Object> map = new HashMap<>();
        map.put("FirstName", Collections.singletonList(new Type("url/FirstName", "Rick")));
        map.put("LastName", Collections.singletonList(new Type("url/LastName", "Pickle")));

        Attributes attributes = new Attributes();
        attributes.setAttributes(map);

        String json = new Gson().newBuilder().setPrettyPrinting().create().toJson(attributes);
        System.out.println(json);
    }
}

Над отпечатками кода:

{
  "attributes": {
    "FirstName": [
      {
        "type": "url/FirstName",
        "value": "Rick"
      }
    ],
    "LastName": [
      {
        "type": "url/LastName",
        "value": "Pickle"
      }
    ]
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...