2017-09-06 1 views
0

json 데이터 구조에서 접두사를 가질 수있는 문자열이 있습니다. JSON을 언 마샬링 할 때 해당 접두어를 제거하는 기능을 사용할 수 있습니까? golang에서 JSON을 언 마샬링하고이를 활용하려고하는 JSON을 살펴 보겠습니다.JSON을 언 마샬링 할 때 Golang이 문자열 접두어를 제거합니다.

예를 들면. 내가 JSON.unmarshall(data, &struct)을 수행 할 때 페이로드는 그렇게 구조체는 항상 id의 값 1234567890이있을 것이다있을 경우 내가 문자열에서 urn:uuid 접두사를 제거 처리 할 수있는 비 정렬 화 기능을하고 싶습니다 다음

{ 
    "id": "urn:uuid:1234567890" 
} 

{ 
    "id": "1234567890" 
} 

중 하나가 될 수 있습니다 .

+2

당신은'사용자 정의 형식을 가지고있다 struct' 해당 유형의'id' 필드를함으로써'json.Unmarshaler' 인터페이스를 구현하는 것이 할 수 있습니다. 'id' 필드가 실제로 내보내 졌는지 확인하십시오. 그렇지 않으면 해독되지 않습니다. – mkopriva

+1

사후 프로세스. 자신이 unmarshaler (너무 많이)를 제공하지 않으면 unmarshaling하는 동안 기본적으로 실행 취소 할 수 있습니다. – Volker

+0

언 마샬링을 사용자 정의하려는 경우 이미 가능하다는 것을 알고 있어야합니다. 그래서 ... 정확히 당신의 질문은 무엇입니까? – Adrian

답변

2

트리밍해야하는 데이터에 사용자 정의 UnmarshalJSON 메서드를 제공 할 수 있습니다. 여기서는 구현 예입니다. 하드 문자열 (또는이 경우에는 바이트 배열)과 일치하는 대신 시작 부분을 정규 표현식으로 사용해야하는 경우 확장해야 할 수도 있습니다) :

go playground

package main 

import (
    "bytes" 
    "encoding/json" 
    "log" 
) 

var (
    sampleJSON = []byte(`{"id": "urn:uuid:1234567890"}`) 
    prefixToTrim = []byte(`urn:uuid:`) 
) 

type IDField string 

type Data struct { 
    ID IDField `json:"id"` 
} 

func main() { 
    d := &Data{} 
    err := json.Unmarshal(sampleJSON, d) 
    if err != nil { 
     log.Fatal(err) 
    } 

    log.Println(d.ID) 
} 

// UnmarshalJSON provides custom unmarshalling to trim `urn:uuid:` prefix from IDField 
func (id *IDField) UnmarshalJSON(rawIDBytes []byte) error { 

    // trim quotes and prefix 
    trimmedID := bytes.TrimPrefix(bytes.Trim(rawIDBytes, `"`), prefixToTrim) 

    // convert back to id field & assign 
    *id = IDField(trimmedID) 
    return nil 
} 
관련 문제