草庐IT

json - 防止在编码(marshal)处按字母顺序排列 json

coder 2024-07-05 原文

我想防止在 Marshal 中按字母顺序重新排序。我的脚本如下。 {"key3": "value3", "key2": "value2", "key1": "value1"}重新排序为 {"key1":"value1","key2":"value2","key3":"value3"}由编码(marshal)。我以为this可能是关闭问题。但我无法解决我的问题。有办法解决吗?

脚本

package main

import (
    "encoding/json"
    "fmt"
)

func main() {
    obj := `{"key3": "value3", "key2": "value2", "key1": "value1"}`
    var o map[string]interface{}
    json.Unmarshal([]byte(obj), &o)
    fmt.Println(o)
    r, _ := json.Marshal(o)
    fmt.Println(string(r))
}

play.golang.org

  • fmt.Println(o)map[key3:value3 key2:value2 key1:value1] .
  • fmt.Println(string(r)){"key1":"value1","key2":"value2","key3":"value3"} .

非常感谢您的宝贵时间。对于我不成熟的问题,我深表歉意。

最佳答案

您可以像这样保留顺序:

type OrderedMap struct {
    Order []string
    Map map[string]string
}

func (om *OrderedMap) UnmarshalJSON(b []byte) error {
    json.Unmarshal(b,&om.Map)

    index:=make(map[string]int)
    for key:=range om.Map {
        om.Order=append(om.Order,key)
        esc,_:=json.Marshal(key) //Escape the key
        index[key]=bytes.Index(b,esc)
    }

    sort.Slice(om.Order, func(i,j int) bool { return index[om.Order[i]]<index[om.Order[j]] })
    return nil
}

func (om OrderedMap) MarshalJSON() ([]byte, error) {
    var b []byte
    buf:=bytes.NewBuffer(b)
    buf.WriteRune('{')
    l:=len(om.Order)
    for i,key:=range om.Order {
        km,err:=json.Marshal(key)
        if err!=nil { return nil,err }
        buf.Write(km)
        buf.WriteRune(':')
        vm,err:=json.Marshal(om.Map[key])
        if err!=nil { return nil,err }
        buf.Write(vm)
        if i!=l-1 { buf.WriteRune(',') }
        fmt.Println(buf.String())
    }
    buf.WriteRune('}')
    fmt.Println(buf.String())
    return buf.Bytes(),nil
}

Playground :https://play.golang.org/p/TxenZEuy_u0

请注意 json 规范说对象是无序的,这意味着其他客户端可能不遵守您保留的顺序。

关于json - 防止在编码(marshal)处按字母顺序排列 json,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48293036/

有关json - 防止在编码(marshal)处按字母顺序排列 json的更多相关文章

  1. ruby-on-rails - 使用一系列等级计算字母等级 - 2

    这里是Ruby新手。完成一些练习后碰壁了。练习:计算一系列成绩的字母等级创建一个方法get_grade来接受测试分数数组。数组中的每个分数应介于0和100之间,其中100是最大分数。计算平均分并将字母等级作为字符串返回,即“A”、“B”、“C”、“D”、“E”或“F”。我一直返回错误:avg.rb:1:syntaxerror,unexpectedtLBRACK,expecting')'defget_grade([100,90,80])^avg.rb:1:syntaxerror,unexpected')',expecting$end这是我目前所拥有的。我想坚持使用下面的方法或.join,

  2. ruby-on-rails - Rails HTML 请求渲染 JSON - 2

    在我的Controller中,我通过以下方式在我的index方法中支持HTML和JSON:respond_todo|format|format.htmlformat.json{renderjson:@user}end在浏览器中拉起它时,它会自然地以HTML呈现。但是,当我对/user资源进行内容类型为application/json的curl调用时(因为它是索引方法),我仍然将HTML作为响应。如何获取JSON作为响应?我还需要说明什么? 最佳答案 您应该将.json附加到请求的url,提供的格式在routes.rb的路径中定义。这

  3. ruby - Chef 执行非顺序配方 - 2

    我遵循了教程http://gettingstartedwithchef.com/,第1章。我的运行list是"run_list":["recipe[apt]","recipe[phpap]"]我的phpapRecipe默认Recipeinclude_recipe"apache2"include_recipe"build-essential"include_recipe"openssl"include_recipe"mysql::client"include_recipe"mysql::server"include_recipe"php"include_recipe"php::modul

  4. ruby - 如何进行排列以有效地定制输出 - 2

    这是一道面试题,我没有答对,但还是很好奇怎么解。你有N个人的大家庭,分别是1,2,3,...,N岁。你想给你的大家庭拍张照片。所有的家庭成员都排成一排。“我是家里的friend,建议家庭成员安排如下:”1岁的家庭成员坐在这一排的最左边。每两个坐在一起的家庭成员的年龄相差不得超过2岁。输入:整数N,1≤N≤55。输出:摄影师可以拍摄的照片数量。示例->输入:4,输出:4符合条件的数组:[1,2,3,4][1,2,4,3][1,3,2,4][1,3,4,2]另一个例子:输入:5输出:6符合条件的数组:[1,2,3,4,5][1,2,3,5,4][1,2,4,3,5][1,2,4,5,3][

  5. ruby - 按值降序排列散列,然后按升序键入 ruby - 2

    我有这样的哈希trial_hash={"key1"=>1000,"key2"=>34,"key3"=>500,"key4"=>500,"key5"=>500,"key6"=>500}我按值降序排列:my_hash=trial_hash.sort_by{|k,v|v}.reverse我现在是这样理解的:[["key1",1000],["key4",500],["key5",500],["key6",500],["key3",500],["key2",34]]但我希望当值相同时按键的升序排序。我该怎么做?例如:上面的散列将以这种方式排序:[["key1",1000],["key3",500

  6. ruby - 匹配大写字母并用后续字母填充,直到一定的字符串长度 - 2

    我有一个驼峰式字符串,例如:JustAString。我想按照以下规则形成长度为4的字符串:抓取所有大写字母;如果超过4个大写字母,只保留前4个;如果少于4个大写字母,则将最后大写字母后的字母大写并添加字母,直到长度变为4。以下是可能发生的3种情况:ThisIsMyString将产生TIMS(大写字母);ThisIsOneVeryLongString将产生TIOV(前4个大写字母);MyString将生成MSTR(大写字母+tr大写)。我设法用这个片段解决了前两种情况:str.scan(/[A-Z]/).first(4).join但是,我不太确定如何最好地修改上面的代码片段以处理最后一种

  7. c - mkmf 在编译 C 扩展时忽略子文件夹中的文件 - 2

    我想这样组织C源代码:+/||___+ext||||___+native_extension||||___+lib||||||___(Sourcefilesarekeptinhere-maycontainsub-folders)||||___native_extension.c||___native_extension.h||___extconf.rb||___+lib||||___(Rubysourcecode)||___Rakefile我无法使此设置与mkmf一起正常工作。native_extension/lib中的文件(包含在native_extension.c中)将被完全忽略。

  8. ruby-on-rails - 如何使用 Rack 接收 JSON 对象 - 2

    我有一个非常简单的RubyRack服务器,例如:app=Proc.newdo|env|req=Rack::Request.new(env).paramspreq.inspect[200,{'Content-Type'=>'text/plain'},['Somebody']]endRack::Handler::Thin.run(app,:Port=>4001,:threaded=>true)每当我使用JSON对象向服务器发送POSTHTTP请求时:{"session":{"accountId":String,"callId":String,"from":Object,"headers":

  9. ruby - 正则表达式将非英文字母匹配为非单词字符 - 2

    @raw_array[i]=~/[\W]/非常简单的正则表达式。当我用一些非拉丁字母(具体来说是俄语)尝试时,条件是错误的。我能用它做什么? 最佳答案 @raw_array[i]=~/[\p{L}]/使用西里尔字符进行测试。引用:http://www.regular-expressions.info/unicode.html#prop 关于ruby-正则表达式将非英文字母匹配为非单词字符,我们在StackOverflow上找到一个类似的问题: https://

  10. ruby - 用 YAML.load 解析 json 安全吗? - 2

    我正在使用ruby2.1.0我有一个json文件。例如:test.json{"item":[{"apple":1},{"banana":2}]}用YAML.load加载这个文件安全吗?YAML.load(File.read('test.json'))我正在尝试加载一个json或yaml格式的文件。 最佳答案 YAML可以加载JSONYAML.load('{"something":"test","other":4}')=>{"something"=>"test","other"=>4}JSON将无法加载YAML。JSON.load("

随机推荐