2016-06-07 4 views
4

이동 중 보통 JSON을 구조체로 비 정렬하고 구조체의 값을 읽습니다. 매우 잘 작동합니다.수동으로 JSON 값을 읽으십시오

이번에는 JSON 개체의 특정 요소에만 관심이 있으며 전반적인 JSON 개체가 매우 크기 때문에 구조체를 만들 필요가 없습니다.

이동 중에는 키를 사용하여 JSON 객체의 값을 조회하거나 평소와 같이 배열을 반복 할 수있는 방법이 있습니까?

다음 JSON을 고려하면 어떻게 title 필드 만 빼낼 수 있습니까?

{ 
    "title": "Found a bug", 
    "body": "I'm having a problem with this.", 
    "assignee": "octocat", 
    "milestone": 1, 
    "labels": [ 
    "bug" 
    ] 
} 
+2

. Unmarshal()의 JSON 패키지에서 가져온 것입니다. * "JSON을 구조체에 비 정렬 화하려면 Unmarshal이 수신 객체 키를 마샬 (구조체 필드 이름이나 해당 태그)에서 사용하는 키와 일치시키고 정확한 일치를 선호하지만 대/소문자를 허용합니다 Uncomarshal은 구조체의 내 보낸 필드 만 설정합니다. "* 필드가 존재하지 않으면 json 키/값 쌍을 무시해야합니다. – Snowman

+0

아아아, 필적 할 수없는 분야에 대해 불평 할 것이라고 생각했습니다. 감사. – conor

답변

1

Darigaaz의 대답을 확장하려면 구문 분석 함수 내에서 선언 된 익명 구조체를 사용할 수도 있습니다. 따라서 패키지 수준의 형식 선언을 사용하여 단일 용도의 코드를 처리하지 않아도됩니다.

https://play.golang.org/p/MkOo1KNVbs

package main 

import (
    "encoding/json" 
    "fmt" 
) 

func main() { 
    test := `{ 
     "title": "Found a bug", 
     "body": "I'm having a problem with this.", 
     "assignee": "octocat", 
     "milestone": 1, 
     "labels": [ 
      "bug" 
     ] 
    }` 

    var s struct { 
     Title string `json:"title"` 
    } 
    json.Unmarshal([]byte(test), &s) 

    fmt.Printf("%#v", s) 

} 
-4

업데이트 :이 답변은 잘못된 것입니다; 나는 이것을 이 아닌이 아니라는 것을 보여주는 예제로 남겨두고 있습니다.

당신은 정규식 다음 (의사)와 그것을 찾아야한다 :

String s = {json source}; 
int i = s.indexOf("\"title\": \"") 
s.substring(i,s.indexOf("\"",i)) 

more on substrings in Java

+0

{ "body": "여기가 \"title \ ": \"pick me \ "", "title": "가능하면 잡으십시오."} – Darigaaz

+0

@Darigaaz? 내가 간단한 해결책이나 영감의 광선을 복잡하게 만들었 기 때문에 그런가요? – Vale

+0

정규식을 사용하여 json/html/xml과 같은 "구조화 된"텍스트를 구문 분석하는 것은 일반적으로 나쁜 생각입니다. 그리고 제가 당신에게 모범을 보였습니다. – Darigaaz

6

그나마 당신이 원하는 해달라고 필드를 선언합니다.

https://play.golang.org/p/cQeMkUCyFy

package main 

import (
    "fmt" 
    "encoding/json" 
) 

type Struct struct { 
    Title string `json:"title"` 
} 

func main() { 
    test := `{ 
     "title": "Found a bug", 
     "body": "I'm having a problem with this.", 
     "assignee": "octocat", 
     "milestone": 1, 
     "labels": [ 
      "bug" 
     ] 
    }` 

    var s Struct 
    json.Unmarshal([]byte(test), &s) 

    fmt.Printf("%#v", s) 

} 

또는 완전히 구조체를 제거하려면 :

var i interface{} 
json.Unmarshal([]byte(test), &i) 

fmt.Printf("%#v\n", i) 
fmt.Println(i.(map[string]interface{})["title"].(string)) 

또는. 그것은 모든 변환 오류를 삼킨 것입니다.

m := make(map[string]string) 

json.Unmarshal([]byte(test), interface{}(&m)) 

fmt.Printf("%#v\n", m) 
fmt.Println(m["title"]) 
0

체크 아웃 go-simplejson

예 : 당신은 당신이 원하는 부품 전용 구조체를 만들 수 있습니다

js, err := simplejson.NewJson([]byte(`{ 
    "test": { 
    "string_array": ["asdf", "ghjk", "zxcv"], 
    "string_array_null": ["abc", null, "efg"], 
    "array": [1, "2", 3], 
    "arraywithsubs": [{"subkeyone": 1}, 
    {"subkeytwo": 2, "subkeythree": 3}], 
    "int": 10, 
    "float": 5.150, 
    "string": "simplejson", 
    "bool": true, 
    "sub_obj": {"a": 1} 
    } 
}`)) 

if _, ok = js.CheckGet("test"); !ok { 
    // Missing test struct 
} 

aws := js.Get("test").Get("arraywithsubs") 
aws.GetIndex(0) 
+0

감사합니다. 그러나 imho, 이것은 외부 종속성을 추가하기에는 너무 사소한 문제입니다. – conor

+1

@conor 물론 그것은 모두 여러분의 필요에 달려 있습니다.예를 들어 JSON 페이로드를 단위 테스트해야 할 때이 라이브러리를 특히 좋아합니다. 하지만 좋은 습관은 작은 작업을 위해 타사 라이브러리를 추가하지 않는 것입니다 :) – basgys

관련 문제