Есть ли способ сериализации Java TreeMap в JSON? - PullRequest
0 голосов
/ 12 июня 2019

У меня есть Java TreeMap frutitas внутри пользовательского объекта на стороне сервера, который я хочу отправить во внешний интерфейс.

Я использую javax.ws и jackson для сериализации. Данные, которые я получаю во внешнем интерфейсе, выглядят так:

{ "frutitas": {
    "entry": [
        {
            "key": "fruto 1",
            "value": "el banano"
        },
        {
            "key": "fruto 2",
            "value": "el pineapple"
        }
    ]
}

Но я хочу получить что-то вроде этого, именно так я и отправляю карту "frutitas" внутри объекта, который отправляю на сервер, когда я хочу загрузить ее:

{ 
    "frutitas": {
        "fruto 1": "el banano",
        "fruto 2": "el pineapple"
    }
}

Ответы [ 3 ]

0 голосов
/ 12 июня 2019

Библиотека Json-Jackson, также известная как FasterXML, является де-факто стандартом для сериализации-десериализации JSON. Работает быстро и широко используется. Ниже приведен простой класс, который я написал для сериализации / десериализации любого объекта. Но в целом вам нужно посмотреть на класс ObjectMapper , чтобы увидеть, как он работает. Вот ссылка Github на проект. Вот зависимости Maven, которые вы можете использовать:

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.9.9</version>
</dependency>
<dependency>
    <groupId>com.fasterxml.jackson.datatype</groupId>
    <artifactId>jackson-datatype-jsr310</artifactId>
    <version>2.9.9</version>
</dependency>

Пример моего класса

package com.bla.json.utils;

import java.io.IOException;

import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.ObjectReader;
import com.fasterxml.jackson.databind.ObjectWriter;
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;


public class JsonUtil {

    private static final ObjectReader objectReader;
    private static final ObjectWriter objectWriter;

    static {
        ObjectMapper objectMapper = new ObjectMapper();
        objectMapper.registerModules(new JavaTimeModule());
        objectMapper.enableDefaultTyping();
        objectReader = objectMapper.reader();
        objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
        objectWriter = objectMapper.writer();
    }

    public static String writeObjectToJsonString(Object object) throws JsonProcessingException {
        String jsonData = null;
        if (object != null) {
            jsonData = objectWriter.writeValueAsString(object);
        }
        return jsonData;
    }

    public static <T> T readObjectFromJsonString(String s, Class<T> type) throws IOException {
        T data = objectReader.forType(type).readValue(s);
        return data;
    }
}
0 голосов
/ 12 июня 2019

Другой вариант - использовать gson.

<dependency>
    <groupId>com.google.code.gson</groupId>
    <artifactId>gson</artifactId>
    <version>2.8.5</version>
</dependency>

И класс, содержащий карту:

public class FrutitasClass {   
   private Map<String, String> frutitas; 
}

Код ниже будет преобразование:

Gson gson = new GsonBuilder().setPrettyPrinting().create();
String json = gson.toJson(frutitasClassObject);

Из:

{
  "frutitas": {
    "fruto 1": "el banano",
    "fruto 2": "el pineapple"
  }
}
0 голосов
/ 12 июня 2019

Вы можете конвертировать TreeMap в JSONObject, как вы ожидали.Вот пример, чтобы вы могли получить идею.

JSONObject jsonObject = new JSONObject(yourTreeMap);

Если вы напечатаете jsonObject, вывод будет таким:

{"fruto 1":"el banan","fruto 2":"el pineapple"}


JSONObject main = new JSONObject();
main.put("frutitas", jsonObject);

{ 
    "frutitas": {
        "fruto 1": "el banano",
        "fruto 2": "el pineapple"
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...