当前位置: 首页 > 面试题库 >

将通用JSON对象解码为多种格式之一

翟宾实
2023-03-14
问题内容

我正在Go中研究基于通用JSON的消息传递协议。我想做的是拥有一个BaseMessage具有一般信息,例如Typetimestamp等。但是同时,我希望能够为某些类型的数据定义更具体的消息结构。

例如:

type Message struct {
    Type      string `json:type`
    Timestamp string `json:timestamp`

}

type EventMessage struct {
    Message
    EventType string
    EventCreator string
    EventData interface{}
}

我有一组处理程序,并确定哪个处理程序应处理该消息,我首先将JSON解码为常规Message类型以检查该Type字段。对于此示例,我将获得与“事件”消息类型关联的处理程序。

当我想EventMessage在结构上声明类型时遇到问题。

以下代码很粗糙,但希望它能显示我对如何处理消息的一般想法。

type Handler func(msg Message) Message
handlers := make(map[string]Handler)

var msg Message
decoder.Decode(&msg)
handler := handlers[msg.Type]
handler(msg)

我尝试使用,interface{}但JSON解码器仅创建了一个地图,然后我无法断言任何一种类型。我已经找到了使之成为可能的解决方法,但是它非常丑陋,可能效率不高,而且很容易出错。我想使事情简单明了,以便可以轻松维护此代码。

Go中是否有处理通用JSON对象的方法,以便解码后的JSON可以是许多结构格式之一?

我也曾想过在Data interface{}Message结构中的a
中包含更多特定信息,但是随后遇到了一个同样的问题,即无法在接口上声明任何类型。必须有一种更好的方法来处理我刚丢失的JSON格式。


问题答案:

处理此问题的一种方法是使用json.RawMessage字段为消息的固定部分定义结构,以捕获消息的变体部分。将json.RawMessage解码为特定于变体的类型:

type Message struct {
  Type      string `json:type`
  Timestamp string `json:timestamp`
  Data      json.RawMessage
}

type Event struct {
   Type    string `json:type`
   Creator string `json:creator`
}


var m Message
if err := json.Unmarshal(data, &m); err != nil {
    log.Fatal(err)
}
switch m.Type {
case "event":
    var e Event
    if err := json.Unmarshal([]byte(m.Data), &e); err != nil {
        log.Fatal(err)
    }
    fmt.Println(m.Type, e.Type, e.Creator)
default:
    log.Fatal("bad message type")
}

游乐场的例子



 类似资料:
  • 问题内容: 希望我不必在这里重新发明轮子,但是有人知道C#中是否有一个类似于Adobe为AS3提供的类,用于将通用对象转换为JSON字符串的类? 例如,当我编码一个对象数组时。 输出: 问题答案: 在C#中:

  • 我有一个以以下格式返回json对象的响应: 我有一个Java类: 我想使用GSON将JSON对象映射到Java对象。 我尝试使用反序列化,它返回了JSON中嵌套值的。

  • 问题内容: 我正在尝试在此链接中使用示例 http://sharpdevpt.blogspot.com/2009/10/deserialize-json- on-c.html?showComment=1265045828773#c2497312518008004159 但是我的项目无法使用JavaScriptConvert.DeserializeObject进行编译,该示例说这是来自.net库,有

  • 你好,我有以下任务: 具有JSON对象的URL: *通过注释定义如何将JSON定义到Java列表中,并找到其中有“名称”的对象。 我认为问题是在不使用任何java库的情况下解析JSON。到目前为止,我已经开发了以下代码: 我在这里做的是我有一个JSONObject类,它将JSON属性存储在映射中,然后我想使用反射来填充任何类。 为了解析JSON,我尝试创建一个迷你FSM(:)),它使用For循环解

  • 问题内容: 我目前正在尝试将收到的JSON对象转换为具有相同属性的TypeScript类,但无法使其正常工作。我究竟做错了什么? 员工阶层 员工字符串 我的尝试 链接到打字稿游乐场 问题答案: 编译器允许您将返回的对象强制转换为类的原因是因为typescript基于结构子类型。 您实际上并没有的实例,而是拥有一个具有相同属性的对象(如在控制台中看到的)。 一个简单的例子: (操场上的代码) 没有错

  • 我试图用GSON将一个对象转换成JSON格式。然后,我将把JSON发送给用php编写的webservice。不幸的是,由于某种原因,gson.toJson(object)方法不起作用。 我有这个java对象干预(它包含字符串、日期、时间和位图类型的几个字段)。当我尝试这样做时: 我在gson变量中得到这个: gson={seralizeNulls: false工厂:[Factory[type=co