我有一个使用字符串作为键和值的映射。我有一个键数组,用于指定地图值的顺序。
我想将该映射序列化为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的情况下才起作用。