2017-02-24 128 views
0

我試圖解碼與結構類型的JSON響應。我試圖解碼對象的實例如下所示:JSON解碼未知對象

{ 
    "title": "Some Title", 
    "views": 344, 
    "profiles": { 
     "customField": "somevalue", 
     "customField2:" :somevalue" 
    } 
} 

的golang結構如下:

type Topic struct { 
    Title   string `json:"title"` 
    Views   string `json:"views"` 
    Profiles  string `json:"profiles"` 
} 

正如你可以看到,在「配置文件」屬性是一個字符串,因爲配置文件對象是未知的,因爲它裏面的字段可以被定義。

我試圖用解碼此:

json.NewDecoder(response.Body).Decode(result) 

如果結果是一個類型的話題,但沒有工作。 「Profiles」屬性應該是什麼類型才能正確解碼答案?

謝謝!

+0

「配置文件」值始終是字符串嗎? – JimB

+0

您是否有''profile'中您感興趣的字段列表?或者您必須閱讀所有字段並對它們進行操作,無論它們是什麼? – nu11p01n73R

+0

配置文件值可以是任何值。我唯一需要的是能夠將該響應發送到Web客戶端,而無需修改或讀取任何內容(我從第三方api中檢索該值,然後返回到客戶端) – Lucia

回答

3

閱讀評論,很明顯,配置文件值可以是任何類型,因此,我建議您將配置文件類型聲明爲map[string]interface{}
主題變成:

type Topic struct { 
    Title   string `json:"title"` 
    Views   int32 `json:"views"` 
    Profiles  map[string]interface{} `json:"profiles"` 
} 
+0

您在結構中存在拼寫錯誤。應該是「字符串」。儘管我不能提出少於10個變化字符的編輯。 – RayfenWindspear

0

退房https://github.com/mitchellh/mapstructure 自述有一個答案,你可能找。

問題是如果您有配置或編碼根據特定字段略有變化。

也許我們無法先從JSON中讀取「type」字段來填充特定的結構。我們總是可以在解碼JSON時做兩遍(首先閱讀「類型」,稍後再閱讀「類型」)。然而,將它解碼成map [string] interface {}結構要簡單得多,讀取「type」鍵,然後使用類似這個庫的東西將它解碼爲適當的結構。

0

如果配置文件可能會有所不同,您應該在這裏採取json.RawMessage。在內部,它是一個[]byte,後者可以解組爲其他類型,例如,取決於外部文檔的值。

請參閱https://golang.org/pkg/encoding/json/#RawMessage和示例。

0

Profiles應該是一個結構,並與容器一起發起的,在這種情況下,我認爲這是一個狀態,比如FB地位或鳴叫我做了這裏https://play.golang.org/p/tG90idakLP

一個例子記住實例化新在開始解組之前,新創建狀態中的配置文件。