2014-08-30 1 views
0

json 문자열을 http 요청에서 map/s 조각으로 변환하려고합니다. 그리고 http 응답에 사용할 json 문자열로 map/s 조각을 변환해야합니다.json을 구조체를 사용하지 않고 Go의 json으로 맵 조각 및 조각으로 변환

다음 두 경우 모두 다음을 map/s 슬라이스로 변환하고 싶습니다. http 요청의 json 문자열은 다음과 같은 몇 가지 동일한 키 값 json 객체의 배열 일 수 있습니다.

[ 
     { title: 'JavaScript: The Good Parts', author: 'Douglas Crockford', 
      releaseDate: '2008', keywords: 'JavaScript Programming' }, 
     { title: 'The Little Book on CoffeeScript', author: 'Alex MacCaw', 
      releaseDate: '2012', keywords: 'CoffeeScript Programming' }, 
     { title: 'Scala for the Impatient', author: 'Cay S. Horstmann', 
      releaseDate: '2012', keywords: 'Scala Programming' }, 
     { title: 'American Psycho', author: 'Bret Easton Ellis', 
      releaseDate: '1991', keywords: 'Novel Splatter' }, 
     { title: 'Eloquent JavaScript', author: 'Marijn Haverbeke', 
      releaseDate: '2011', keywords: 'JavaScript Programming' } 
] 

또는 하나와 같은;

{ title: 'Eloquent JavaScript', author: 'Marijn Haverbeke', 
    releaseDate: '2011', keywords: 'JavaScript Programming' } 

두 번째 작업은 map/s 슬라이스를 json 문자열로 변환하는 것입니다.

그러나 나는이 두 가지 절차를 성공적으로 수행 할 수 없었습니다.

json 패키지를 사용하면 구조체에 대해이 두 가지 작업을 수행 할 수 있습니다.

디자인 관련 문제로 사전에 코딩 된 구조체를 사용하지 않아야합니다.

Go에서이를 수행 할 수있는 알려진 방법이 있습니까?

답변

2

당신은 같은 것을 사용해야 할 것입니다 당신은 정말 사용 map[string]interface{}을 사용할 수 있습니다 그것은 잘 { "title": ....., "keywords": ["CoffeeScript", "Programming"] }와 함께 작동합니다 :

for i := 0; i < len(b); i++ { 
    fmt.Printf("%s by %s was release at %s\n", b[i]["title"], b[i]["author"]) 
    switch v := b[i]["keywords"].(type) { 
    case []interface{}: 
     for i := 0; i < len(v); i++ { 
      switch v := v[i].(type) { 
      case string: 
       fmt.Println("\tstring in a slice", v) 
      case float64: //numbers in json are float64 by default 
       fmt.Println("\tnumber in a slice", v) 
      default: 
       fmt.Printf("\tunknown type (%T)", v, v) 
      } 
     } 
    case string: 
     fmt.Println("\tstring", v) 
    } 
} 

playground

+0

내가 말한 문제의 중첩 된 속성의 해결책은'interface {} '와 관련이 있다고 대답합니다. 그것을 사용하는 방법을 모릅니다. 나는 그것을 공부할 것입니다. 나는 당신에게 내가 물건을 인쇄하려고하지 않고 있음을 상기시켜야합니다. – fsc

+0

^당신이 그것을 어떻게 사용하는지 더 자세한 예제를 추가하겠습니다. – OneOfOne

+1

@FarukSelcuk 스위치 안에는 v가 적절한 유형이므로,'case string'에서 v는 문자열입니다. – OneOfOne

1

json.NewDecoder을 사용하면 JSON을지도 조각으로 변환하고 json.NewEncoder을 사용하여지도 조각을 JSON으로 변환해야합니다.

은 내가 http://play.golang.org/p/jbXYGC5pp2

이 주석에 설명을 참조 여기를 썼다.

내가이 도움말을 희망

+0

을 예를 들어 중첩 된 json 객체를 사용하면 값이 다음 문자열의'keywords' 키 값과 같은 배열 일 때 가능합니까?'[{title : 'JavaScript : The Good Parts'작성자 : 'Douglas Crockford', releaseDate : '2008', 키워드 : [ "JavaScript", "Programming"]}, ... ' – fsc

+1

@FarukSelcuk 사용할 때 가능합니다. 구조체. 지도를 대신 사용하려면 맵이 키 값 쌍일 뿐이므로 불가능하다고 생각합니다. – pyk

+0

이론적으로 완전히 중첩 된 jsons, 즉 (모든) json을 파고 들어갈 수있는 전체 파서를 구현할 수 있어야하며, 문자열에 함수를 작성합니다. 그러나 가까운 나에게는 불가능한 것처럼 보인다. 놀랍게도 그것은 존재하지 않고 남아있는 가능성이 남아 있거나 불가능하기 때문에 존재하는 것은 한 가지 일을하는 것입니다. – fsc

관련 문제