Построить строку JSON из полей String и Map с помощью GSon?

#java #json #gson

#java #json #gson

Вопрос:

Я пытаюсь написать оболочку вокруг JSON для отправки сообщений websocket. Я создал этот класс, который позволяет вам создавать с именем события, а затем передавать ассоциативный массив данных события.

Как я могу проанализировать JSON в таком getString методе, вот пример JSON:

 {
    "event_name": "some event name",
    "event_data": {
        "some data": "some data value",
        "some more dat": "some more data value"
    }
}
  

Класс:

 package com.eu.websockets.events.server;

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

public abstract class ServerWebSocketEvent {
    private String eventName;
    private Map<String, String> eventData;

    public ServerWebSocketEvent(String eventName) {
        this.eventName = eventName;
        this.eventData = new HashMap<>();
    }

    public void addEventData(String key, String value) {
        eventData.put(key, value);
    }

    public String getString() {
        
    }
}
  

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

1. Вы пытаетесь сериализовать свой ServerWebSocketEvent файл в JSON или десериализовать его из JSON? Термин «синтаксический анализ» обычно используется при десериализации данных, но звучит так, как будто вы хотите сериализовать. Не могли бы вы также показать, что вы пробовали до сих пор (на случай, если у вас есть какой-то нерабочий код)?

2. Я хочу взять строку и сопоставить и создать из нее строку JSON @Marcono1234 для отправки обратно клиенту. Я включил шаблон в свой вопрос.

Ответ №1:

Чтобы имена полей отличались от тех, которые вы представляете в JSON, вам нужно либо указать это с @SerializedName помощью, либо в этом случае вы также можете установить FieldNamingPolicy на свой Gson .

Итак, с @SerializedName :

     @SerializedName("event_name")
    private String eventName;
    @SerializedName("event_data")
    private Map<String, String> eventData;
    ...
public String getString() {
    return new Gson().toJson(this)
}
  

или с FieldNamingPolicy подобным:

 public String getString() 
    return new GsonBuilder()
        .setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES)
        .setPrettyPrinting() // This one is not needed use if you want to
        .create().toJson(this);
}