草庐IT

json - 去 json.Unmarshal 接口(interface)一些子句消失了

coder 2024-07-14 原文

我有一句查询一组用户的语句(关键字字段存在uid)和范围限制(long filed present unixtime),该句子可以在Kibana和curl中执行,但是当我使用 golang 客户端(https://github.com/olivere/elastic)执行查询时,在 json. Unmarshal(),语句被篡改,范围请求被放弃,为什么?我的句子违反了json的规则?

package main

import (
    "encoding/json"
    "fmt"
)

var hot_cache map[string]byte
var followers []string

var prefix = "{\"constant_score\" : {\"filter\" : {\"bool\" : {\"filter\" : {\"range\" : {\"unixtime\" : {\"gte\" : %d, \"lte\" : %d}}}, \"filter\" : {\"terms\" : {\"uid\" : ["
var suffix = "]}}}}}}"

func main() {

    tmp := prefix
    tmp += "\""
    tmp += "123"
    tmp += "\""
    tmp += suffix

    qstr := fmt.Sprintf(tmp, 1, 2)
    fmt.Println("raw: ", qstr)

    var f interface{}
    err := json.Unmarshal([]byte(qstr), &f)
    if err != nil {
        panic(err)
    }

    fmt.Println("json: ", f)
}

输出:

 raw:  {"constant_score" : {"filter" : {"bool" : {"filter" : {"range" : {"unixtimestamp" : {"gte" : 1, "lte" : 2}}}, "filter" : {"terms" : {"uid" : ["123"]}}}}}}

json: map[constant_score:map[filter:map[bool:map[filter:map[terms:map[uid:[123]]]]]]]

谁知道为什么?

最佳答案

您的“qstr”输入 JSON 字符串包含键 constant_score.filter.bool.filter 两次,这导致解析器为其保留第二个值。

{
  "constant_score": {
    "filter": {
      "bool": {
        "filter": { "range": { "unixtime": { "gte": 1, "lte": 2 } } },
        "filter": { "terms": { "uid": [123] } }
      }
    }
  }
}

JSON 语法 does not disallow repeated keys ;然而,它也不要求解析器以任何特殊方式处理它们,因此绝大多数 JSON 解析器选择将重复键的 last 值存储在一个对象中,而 Go 的解码器不是不同。

这是一个示例 - 考虑以下有效的 JSON 字符串:

{"a":1,"a":2}

假设您将此文档反序列化为一个对象(例如 map 、字典、k/v 存储等)。由于键在此类数据结构中是唯一的,因此应为键“a”、1 或 2 存储什么值?

// JavaScript
JSON.parse('{"a":1,"a":2}'); // => {a: 2}

# Ruby
JSON.parse('{"a":1,"a":2}') # => {"a" => 2}

# Python
json.loads('{"a":1,"a":2}') # => {u'a': 2}

// Go
var obj interface{}
err := json.Unmarshal([]byte(`{"a":1,"a":2}`), &obj)
if err != nil {
  panic(err)
}
fmt.Printf("%#v\n", obj)
// map[string]interface {}{"a":2}

关于json - 去 json.Unmarshal 接口(interface)一些子句消失了,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47408242/

有关json - 去 json.Unmarshal 接口(interface)一些子句消失了的更多相关文章

  1. 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的路径中定义。这

  2. ruby-on-rails - 如何生成传递一些自定义参数的 `link_to` URL? - 2

    我正在使用RubyonRails3.0.9,我想生成一个传递一些自定义参数的link_toURL。也就是说,有一个articles_path(www.my_web_site_name.com/articles)我想生成如下内容:link_to'Samplelinktitle',...#HereIshouldimplementthecode#=>'http://www.my_web_site_name.com/articles?param1=value1¶m2=value2&...我如何编写link_to语句“alàRubyonRailsWay”以实现该目的?如果我想通过传递一些

  3. 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":

  4. postman接口测试工具-基础使用教程 - 2

    1.postman介绍Postman一款非常流行的API调试工具。其实,开发人员用的更多。因为测试人员做接口测试会有更多选择,例如Jmeter、soapUI等。不过,对于开发过程中去调试接口,Postman确实足够的简单方便,而且功能强大。2.下载安装官网地址:https://www.postman.com/下载完成后双击安装吧,安装过程极其简单,无需任何操作3.使用教程这里以百度为例,工具使用简单,填写URL地址即可发送请求,在下方查看响应结果和响应状态码常用方法都有支持请求方法:getpostputdeleteGet、Post、Put与Delete的作用get:请求方法一般是用于数据查询,

  5. 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("

  6. ruby-on-rails - environment.rb 中设置的常量在开发模式中消失 - 2

    了解Rails缓存如何工作的人可以真正帮助我。这是嵌套在Rails::Initializer.runblock中的代码:config.after_initializedoSomeClass.const_set'SOME_CONST','SOME_VAL'end现在,如果我运行script/server并发出请求,一切都很好。然而,在我的Rails应用程序的第二个请求中,一切都因单元化常量错误而变得糟糕。在生产模式下,我可以成功发出第二个请求,这意味着常量仍然存在。我已通过将以上内容更改为以下内容来解决问题:config.after_initializedorequire'some_cl

  7. ruby - 找一些句子 - 2

    我想找到在某些文本中找到一些(让它是两个)句子的好方法。什么会更好-使用正则表达式或拆分方法?你的想法?应JeremyStein的要求-有一些例子示例:输入:ThefirstthingtodoistocreatetheCommentmodel.We’llcreatethisinthenormalway,butwithonesmalldifference.IfwewerejustcreatingcommentsforanArticlewe’dhaveanintegerfieldcalledarticle_idinthemodeltostoretheforeignkey,butinthis

  8. ruby - 当你有一个没有参数的 case 语句并且 when 子句是 lambda 时会发生什么? - 2

    这段代码没有像我预期的那样执行:casewhen->{false}then"why?"else"ThisiswhatIexpect"end#=>"why?"这也不是casewhen->(x){false}then"why?"else"ThisiswhatIexpect"end#=>"why?"第一个then子句在两种情况下都被执行,这意味着我提供给when子句的lambda没有被调用。我知道无论when子句的主题是什么,都应该调用大小写相等运算符===。我想知道当没有为case提供参数时,===的另一边会发生什么。我在想它可能是nil,但它不可能是:->{false}===nil#=>

  9. ruby-on-rails - Rails 渲染带有驼峰命名法的 json 对象 - 2

    我在一个简单的RailsAPI中有以下Controller代码:classApi::V1::AccountsControllerehead:not_foundendendend问题在于,生成的json具有以下格式:{id:2,name:'Simpleaccount',cash_flows:[{id:1,amount:34.3,description:'simpledescription'},{id:2,amount:1.12,description:'otherdescription'}]}我需要我生成的json是camelCase('cashFlows'而不是'cash_flows'

  10. ruby - 使用 JSON gem 将自定义对象转换为 JSON - 2

    我正在学习如何使用JSONgem解析和生成JSON。我可以轻松地创建数据哈希并将其生成为JSON;但是,在获取一个类的实例(例如Person实例)并将其所有实例变量放入哈希中以转换为JSON时,我脑袋放屁。这是我遇到问题的例子:require"json"classPersondefinitialize(name,age,address)@name=name@age=age@address=addressenddefto_jsonendendp=Person.new('JohnDoe',46,"123ElmStreet")p.to_json我想创建一个.to_json方法,这样我就可以获

随机推荐