2017-09-06 2 views
0

私のjsonデータ構造では、プレフィックスを持つことができる文字列があります。 JSONのアンマーシャリング時に、その接頭辞を削除する機能を持つことは可能ですか?私はgolangでカスタムJSONをアンマーシャリングし、それを活用しようとしています。JSONのアンマーシャリング時にGolangが文字列プレフィックスを削除します

たとえば、それがある場合、構造体は常にidの値1234567890を持つことになりますので、私はJSON.unmarshall(data, &struct)私は文字列からurn:uuidプレフィックスを取り除く処理するためにアンマーシャリング機能が欲しいんときペイロードには、以下の

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

{ 
    "id": "1234567890" 
} 

のいずれかになります。

+2

あなたは 'struct'の' id'場を作ることによって、カスタムタイプがあり、その型が 'json.Unmarshaler'インターフェイスを実装していることを行うことができます。 'id'フィールドが実際にエクスポートされていることを確認してください。さもなければ、それはデコードされません。 – mkopriva

+1

後処理。あなた自身のマーマーマーラー(あまりにも多く)を用意していなければ、アンマーシャリング中に元に戻すことができません。 – 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 
} 
関連する問題