我正在开发一个使用Go的网站,并将其连接到弹性搜索。在弹性搜索中,我可以为索引类型设置动态字段。当我从弹性搜索中读取文档时,它将返回一个JSON对象作为结果,该对象可以包括具有动态名称的字段(或用户定义的字段)。
我可以获取JSON结果并将其解组到Go结构中,但我不知道将这些动态字段作为Go结构的一部分的最佳方法是什么。
这就是我正在做的。例如,如果我从弹性搜索中获得一个联系人的文档,它可能看起来如下所示:
{
"EmailAddress": "test@test.com",
"Name": "Test Contact",
"Phone": "17894785236",
"City": "San Francisco",
"State": "California"
}
联系人的Go结构为:
type Contact struct {
EmailAddress string
Name string
Phone string
CustomFields map[string]interface{}
}
并且我实现封送拆收器和反封送拆收器来重写对象的封送拆收方式。
func (c *Contact) MarshalJSON() ([]byte, error) {
contactMap := make(map[string]interface{})
contactMap["EmailAddress"] = c.EmailAddress
contactMap["Name"] = c.Name
contactMap["Phone"] = c.Phone
for k, v := range c.CustomFields {
contactMap[k] = v
}
return json.Marshal(contactMap)
}
func (c *Contact) UnmarshalJSON(data []byte) error {
var contactMap map[string]interface{}
if c == nil {
return errors.New("RawString: UnmarshalJSON on nil pointer")
}
if err := json.Unmarshal(data, &contactMap); err != nil {
return err
}
c.EmailAddress = contactMap["EmailAddress"].(string)
c.Name = contactMap["Name"].(string)
c.Phone = contactMap["Phone"].(string)
for key, val := range contactMap {
if key != "EmailAddress" && key != "Name" && Key != "Phone" {
c.CustomFields[key] = value
}
}
return nil
}
这是最好的方法吗?你有什么推荐的吗?
加点清理就行了
var contactMap map[string]interface{}
if c == nil {
return errors.New("RawString: UnmarshalJSON on nil pointer")
}
if err := json.Unmarshal(data, &contactMap); err != nil {
return err
}
for key, val := range contactMap {
switch key {
case "EmailAddress":
c.EmailAddress = val.(string)
case "Name":
c.Name = val.(string)
case "Phone":
c.Phone = val.(string)
default:
c.CustomFields[key] = val
}
}
}
我是golang的新手,正在尝试解析来自web服务的一些响应,响应看起来像这样: 您可以看到每个元素都有一个键“数据”和“类型”(必须),但不同的“类型”会带来不同的“数据”字段。 你能建议一种有效的方法来构建这种对Golang结构的响应吗? 谢谢你。
问题内容: 我在以下架构中具有json对象: 在这里,该字段包含一个嵌入的json对象,并且该对象的模式是动态的,并且每次都不同。 的对象是不同的API服务,以及不同的API服务的不同方法获得的原始输出。不可能将其映射到所有可能的值。 是否可能有如下所示的java类: 或者类似的东西,以便我可以接收基本架构并对其进行处理,然后将其发送到相关类,该类将转换为适当的预期类? 问题答案: 使用 您可以从
对于使用Java Spring RestTemplate完成的HTTP请求,我得到一个JSON键值对对象的响应,该对象带有动态键,如下所示。 回应: 如何将响应对象映射到POJO或映射? 我使用RestTemplate如下所示。
问题内容: Jackson json注释中以下jax-b注释的等效方式是什么? 我需要生成json而不是xml,并且需要了解在jax-b中等效表示的常规jackson批注。 重命名字段。 使用getter代替字段。 如果json / xml元素名称是Java保留字(例如“ ”,“ ”,“ ”等),则这些功能尤其重要。 因此我们必须将POJO字段分别命名为“ new ”,“ _ public ”,“
问题内容: 我在了解如何实现这一目标方面遇到了问题。 基本上我们有一个API,用户发送以下格式的JSON :(如果代码不完美,请原谅,但您可以理解) 好的,我不确定我是否正确设置了JSON格式,但是现在这是我的问题。 我有一个带有参数Name,Last的类,还有一个作为其成员之一的对象Client和Property Date。 像这样: 因此,基本上,我不确定如何获取JSON,然后将其映射到我的对
问题内容: 我正在从syscall到Go中的某些WinApi获得结果。我可以轻松地从C代码映射简单的结构,但是如何处理如下的C结构? 如果在Go中定义了所有可能的类型 在将这个Go结构作为参数进行系统调用之后,我已经将它存储在内存中并且可以像往常一样在Go中访问它,但是(在上面的代码中)仅始终填充(在上面的代码中)之后的第一个字段,其他两个字段始终为空。我知道这是C语言中的预期行为,因为一次只能有