2016-11-22 11 views
0

Если вы имеете следующую структуру JSON:Как декодировать JSON в зависимости от типа объекта в Golang

[ 
    { 
    "type": "home", 
    "name": "house #1", 
    ... some number of properties for home #1 
    }, 
    { 
    "type": "bike", 
    "name": "trek bike #1", 
    ... some number of properties for bike #1 
    }, 
    { 
    "type": "home", 
    "name": "house #2", 
    ... some number of properties for home #2 
    } 
] 

Как вы расшифровать это в Golang на структуру, не зная, что каждый тип, пока вы не маршализацию объекта. Похоже, вам нужно было бы сделать это дважды в два раза.

Кроме того, что я могу сказать, вероятно, я должен использовать RawMessage для задержки декодирования. Но я не уверен, как это будет выглядеть.

Скажем, у меня были следующие:

структур
type HomeType struct { 
    Name     string  `json:"name,omitempty"` 
    Description   string  `json:"description,omitempty"` 
    Bathrooms    string  `json:"bathrooms,omitempty"` 
    ... more properties that are unique to a home 
} 

type BikeType struct { 
    Name     string  `json:"name,omitempty"` 
    Description   string  `json:"description,omitempty"` 
    Tires     string  `json:"tires,omitempty"` 
    ... more properties that are unique to a bike 
} 

Второй вопрос. Возможно ли это сделать в потоковом режиме? Ибо когда этот массив действительно большой?

Благодаря

+0

Если есть поле «типа», и все атрибуты являются строками, то почему бы не просто распаковать в '[] карта [строка] строки '? – JimB

+0

Представьте объекты JSON, обладающие множеством свойств, включая под-объекты и массивы объектов. – jordan2175

ответ

2

Если вы хотите, чтобы манипулировать объекты, которые вы должны будете знать, какой тип они. Но если вы только хотите, чтобы передать их, например: Если вы получаете из БД некоторый большой объект только Marshal его и передать его на стороне клиента, вы можете использовать пустой interface{} тип:

type HomeType struct { 
    Name     interface{}  `json:"name,omitempty"` 
    Description   interface{}  `json:"description,omitempty"` 
    Bathrooms    interface{}  `json:"bathrooms,omitempty"` 
    ... more properties that are unique to a home 
} 

type BikeType struct { 
    Name     interface{}  `json:"name,omitempty"` 
    Description   interface{}  `json:"description,omitempty"` 
    Tires     interface{}  `json:"tires,omitempty"` 
    ... more properties that are unique to a bike 
} 

Читайте здесь для больше о пустых интерфейсах - link

надежды это то, что вы Мент