2017-08-07 56 views
-2

所有使用JSON的示例都描述瞭如何序列化爲簡單或用戶類型(如結構體)的JSON序列化爲JSON動態結構

但我有不同的情況:a)我不知道我的類型/對象的字段b)每個對象都有不同的類型。

這裏是我的僞代碼的情況:

while `select * from item` do 
    while `select fieldname, fieldvalue from fields where fields.itemid = item.id` do 
    ... 

對於我的數據庫中,我得到字段名和字段值,每個實體。在結果我需要得到這樣的東西:

{ 
    "item.field1": value, 
    ... 
    "item.fieldN": value, 
    "custom_fields": { 
    "fields.field1": value, 
     ... 
    "fields.fieldK": value 
    } 
} 

什麼是最好的方式去做呢?標準庫中是否有任何有用的庫或函數?

更新:數據的來源是數據庫。在結果中,我需要獲取JSON作爲字符串將其發佈到外部Web服務。所以,程序只是從數據庫中讀取數據,並向POST服務發出POST請求。

+0

我認爲你可以用自定義封送拆封器來實現這一點。我認爲Go沒有能力在默認情況下完成這項工作,您將不得不編寫自己的邏輯。 'encoding/json'包允許在你的結構上定製一個編組器。看看[這裏](https://golang.org/pkg/encoding/json/#example__customMarshalJSON)。 – Lansana

+1

看看[https://stackoverflow.com/questions/40559250/golang-dynamic-creating-member-of-struct/40568896](https://stackoverflow.com/questions/40559250/golang-dynamic-creating的-結構-member-/ 40568896#40568896)。這個例子是'Unmarshal',但想法是一樣的,即將你的對象保存爲'map [string] interface {}',然後使用'json.Marshal'將該對象序列化爲JSON。 – putu

回答

1

你的目標類型應該是什麼?它不能是一個結構,因爲您事先不知道這些字段。

唯一的嵌合型我似乎map[string]interface{}類型的map:任何與它的嵌套結構可以實現:

a := map[string]interface{}{ 
    "item.field1": "val1", 
    "item.field2": "val2", 
    "item.fieldN": "valN", 
    "custom_fields": map[string]interface{}{ 
     "fields.field1": "cval1", 
     "fields.field2": "cval2", 
    }, 
} 
b, err := json.Marshal(a) 

見操場樣品here

如你暗示的那樣從數據庫中填充這個結構應該可能是一個自定義腳本(不使用json)。

注意:custom_fields也可以是其他類型,具體取決於值列在數據庫中的類型。如果值列是字符串,則使用map[string]string

+0

>>你的目標類型應該是什麼?我不需要一個類型。我需要json作爲字符串將其發佈到外部Web服務。謝謝。 – demas

+0

你總是有一個類型,如果它是'interface {}'。你的問題不太清楚。你的目標似乎是字符串,但你的來源是什麼? – TehSphinX

+0

源是數據庫。我需要從數據庫讀取數據並向POST服務器發送POST請求。 – demas