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

使用特定顺序序列化地图

宋铭
2023-03-14
问题内容

我有一个使用字符串作为键和值的映射。我有一个键数组,用于指定地图值的顺序。

我想将该映射序列化为JSON,但要保持数组上定义的顺序。

这里有一个示例代码:http :
//play.golang.org/p/A52GTDY6Wx

我想将其序列化为:

{
  "name": "John",
  "age": "20"
}

但是,如果我直接序列化地图,则密钥按字母顺序排列:

{      
  "age": "20",
  "name": "John"
}

我可以将其序列化为地图数组,从而保持顺序,但是会生成很多不需要的字符:

[
  {
    "name": "John"
  },
  {
    "age": "20"
  }
]

在我的真实代码中,我需要序列化在文本文件中指定的数据库查询的结果,并且需要维护列的顺序。我 不能 使用结构,因为在编译时这些列是未知的。

编辑:我不需要稍后以指定的顺序读取JSON。生成的JSON是供人们阅读的,因此我只希望它对人类尽可能可读。

我可以使用自定义格式,但是JSON非常适合我。

谢谢!


问题答案:

对于您实际上根本不需要使用的特定要求json.Marshal,您可以像这样简单地实现自己的功能:

type OrderedMap map[string]string

func (om OrderedMap) ToJson(order ...string) string {
    buf := &bytes.Buffer{}
    buf.Write([]byte{'{', '\n'})
    l := len(order)
    for i, k := range order {
        fmt.Fprintf(buf, "\t\"%s\": \"%v\"", k, om[k])
        if i < l-1 {
            buf.WriteByte(',')
        }
        buf.WriteByte('\n')
    }
    buf.Write([]byte{'}', '\n'})
    return buf.String()
}
func main() {
    om := OrderedMap{
        "age":  "20",
        "name": "John",
    }
    fmt.Println(om.ToJson("name", "age"))
}


 类似资料:
  • 问题内容: 我正在使用Newtonsoft.Json序列化程序将C#类转换为JSON。对于某些类,我不需要将序列化器设置为具有单个属性的实例,而只需在对象上调用ToString,即 我应该怎么做才能使Person对象序列化为其ToString()方法的结果?我可能有许多这样的类,所以我不想以特定于Person类的序列化器结尾,我想拥有一个可以应用于任何类的序列化器(我想通过属性)。 问题答案: 您

  • 我目前正在尝试使用Jackson2.8.4将自定义映射类型序列化和反序列化为JSON。我已经设法基于这个答案实现了序列化,但我正在与反序列化作斗争。下面是一个例子:

  • 问题内容: 我想使用GSON将下面的Example类序列化为JSON。 我期望得到以下输出: 但是调用函数返回 看来GSON无法在Map 内序列化Map 。这是GSON的限制,还是我在这里做错了? 问题答案: Nishant的答案之所以起作用,是因为Gson的默认构造函数默认启用了所有东西,否则您将不得不使用GsonBuilder手动启用它们。 从JavaDocs: 使用默认配置构造一个Gson对

  • 我有一个具有两个属性的JSON对象:“key”(字符串)和“value”(可以反序列化为Java bean)。 问题是,给定一个这样的物体列表,我能把它反序列化为一张地图吗? 当前使用Jackson-databind 2.1

  • 我有一个表格,例如如下: 我想在特定条件下对上述数据进行排序,例如:按升序对值s2的数据进行排序,其中col2=A5,这意味着数据应按正常顺序进行排序,但如果col2='A5',则值s2的顺序应为升序或降序的行应排在第一位,如下所示。 col2='A5'中的数据应根据列values2的值按升序或降序排列。这能实现吗? 具体来说,让我们只进行排序。如果我按col2下单。行将按A1、A2、A3、A4、

  • 但这只有在保证先设置start的情况下才起作用。