2017-11-21 1 views
-3

검색어 (키워드 필드 현재 uid)와 범위 제한 (현재 긴 시간 동안 unixtime)으로 사용자 그룹을 쿼리하는 문장이있는 경우 문장을 Kibana에서 실행할 수 있습니다. curl하지만 json 후에 golang 클라이언트 (https://github.com/olivere/elastic)를 사용하여 쿼리를 수행 할 때. Unmarshal(), 문장이 변조되었습니다. 범위 요청이 취소되었습니다. 이유가 무엇입니까? 내 문장이 아들의 규칙에 어긋나는거야?go json.Unmarshal 일부 구문이 사라졌습니다.

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 : 맵 [constant_score : 맵 [필터 : 맵 [BOOL : 맵 [필터 : 맵 [조건 : 맵 [UID : [123] ]]]]]

어떤 이유인지 알고 계십니까?

+1

원시 json이 손상되었습니다. "bool"개체에 "필터"라는 이름의 두 필드가 포함되어 있습니다. 그냥 예쁜 qstr을 인쇄하면 볼 수 있습니다. Protip : 그것이 작동하지 않으면 당신은 입력을 엉망으로 만들었습니다. – Volker

+0

두 개의 필터 필드가있는 객체가 있기 때문에 – mkopriva

+0

고마워요.하지만이 문장은 키나바에서 실행할 수 있습니다. 또는 탄성 서버로 컬 할 수 있습니다. – user8095277

답변

0

"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 파서는 마지막으로 키를 객체에 반복 저장하는 것으로 선택하고 go unmarshaler는 다르지 않습니다.

다음은 예입니다 - 다음과 같은 유효한 JSON 문자열을 고려해

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

당신이 객체로이 문서를 직렬화 가정 (예를 들어,지도, 사전, 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} 
관련 문제