2013-02-02 58 views
2

我需要通過JSON導出一些大型結構,並取回JSON字符串來更新只有一些它的屬性。JSON編碼器/解碼器「發佈」的不同結構屬性

讓我們下面的結構:

type House struct { 
    Name string `json:"name"` 
    Rooms int  `json:"rooms_count"` 
    Owner *Owner `json:"-"` 
} 

編碼與encoding/json將導致一個JSON字符串像

{"name":"some name", "rooms_count":5} 

我現在得到這個JSON字符串:

{"name":"some other name", "rooms_count":7, Owner:{something...}} 

用戶想要改變每一個屬性。 Owner是不允許的,因爲它沒有被導出。但我只想只允許更改rooms_count。有什麼方法可以說某些屬性應該與Encoder一起導出,但Decoder不能使用?不得不寫所有這些檢查手冊將是非常不愉快的。

+0

您的解釋很難遵循我害怕。你能澄清你想達到什麼嗎?這是你想要的嗎? http://stackoverflow.com/questions/11126793/golang-json-and-dealing-with-unexported-fields它允許一個私有結構與導出的字段,所以你可以定義你想要訪問的getters/setters,但導出整個結構。 – minikomi

+0

@minikomi:不,我想爲編碼器導出不同的字段而不是解碼器。因爲用戶應該能夠看到更多的字段,而不是允許更改。如果您編寫API,這是一項非常常見的任務。 –

回答

0

我爲encoding/json包創建了一個補丁並打開了一個ticket

它只爲分別忽略EncoderDecoder中的struct字段的結構添加了2個標記選項。例如,所有兩個字段都被編碼/導出,但只有Name正在解碼/更新:

type House struct { 
    Name string `json:"house_name"` 
    PubDate time.Time `json:"pub_date,nodecode"` 
} 
+0

轉4747狀態:WorkingAsIntended。 – peterSO

+0

儘管如此,我可以找到最好的解決方案。我現在使用的是一個自定義的json編碼器包,這爲我節省了數百行代碼和複雜性。 –

0

在你的確切的情況下,簡單地解組一個新的結構,並做一個currentStruct.Rooms = newStruct.Rooms正是你想要的。

對於這種類型的自定義編組,沒有一個完全直接的方式來做到這一點。你可以得到的最好結果是兩個相同的結構,不同的標籤用於不同的場合和一些反射來執行它們之間的轉換。

+0

感謝您的回答。好吧,似乎沒有其他辦法。不幸的是,這正是我絕對不想要的。我正在嘗試修改json軟件包並添加一個「notencoding」/「notdecoding」標籤。 –