【问题标题】:Build JSON string from String and Map<String, String> fields with GSon?使用 GSon 从 String 和 Map<String, String> 字段构建 JSON 字符串?
【发布时间】:2020-10-23 15:02:20
【问题描述】:

我正在尝试围绕 JSON 编写一个包装器来发送 websocket 消息。我创建了这个类,它允许您使用事件名称进行构造,然后传递事件数据的关联数组。

我怎样才能像这样在getString 方法中解析 JSON,这里是 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() {
        
    }
}

【问题讨论】:

  • 您是在尝试将您的ServerWebSocketEvent 序列化为 JSON 还是尝试从 JSON 反序列化?反序列化数据时通常使用的术语“解析”,但听起来您想序列化。您能否也展示一下您迄今为止尝试过的内容(以防您有一些无效的代码)?
  • 我想获取一个字符串并映射并从中创建一个 JSON 字符串 @Marcono1234 以发送回客户端。我在我的问题中包含了一个模板。

标签: java json gson


【解决方案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);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-11-28
    • 1970-01-01
    • 2011-02-01
    • 2018-02-14
    • 2012-12-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多