2017-02-03 3 views
0

Я пишу приложение в Go, что делате две формы JSON:Обработка двух форм JSON?

Пример 1:

{"book_data":{"title":"book-title","page_number":457}} 

Пример 2:

{"book_data":{"collection":214},"books":{"data":[{"title":"book-title","page_number":457},{"title":"book-title","page_number":354}]}} 

Я думал, что может создать структуру, подобную следующей, и включить в нее JSON:

type Book struct { 
    Title  string `json:"title"` 
    PageNumber int `json:"page_number"` 
} 

но это работает только для первого примера.

Как я могу обрабатывать JSON из обоих примеров?

+0

Отклонить частично, затем проверить ключи и решить, что делать дальше. Аналогичный вопрос http://stackoverflow.com/questions/11066946/partly-json-unmarshal-into-a-map-in-go –

+0

Возможный дубликат [Частично JSON unmarshal на карте в Go] (http: // stackoverflow. ком/вопросы/11066946/частично JSON-в-распаковать-а-карта в ходе) – nyedidikeke

ответ

1

Вы можете сначала отменить предварительную сортировку в json.RawMessage, чтобы решить следующее в зависимости от немаршаллированной полезной нагрузки. И вы также можете просто развязать более общую структуру. Что-то вроде

type Book struct { 
    Title  string `json:"title"` 
    PageNumber int `json:"page_number"` 
} 
type BookShelf struct { 
    BookData struct { 
     Book 
     Collection int `json:"collection"` 
    } `json:"book_data"` 
    Books struct { 
     Data []Book `json:"data"` 
    } `json:"books"` 
} 

, который для меня выглядит читабельным, содержательным и удобным для дальнейшей обработки.

0

Почему бы не отобразить карту [string] interface {}, а затем использовать результат, чтобы увидеть, какую форму вам нужно обрабатывать? Затем вы можете десериализовать определенный тип структуры для каждой формы.

Другим способом было бы использовать следующий пакет, чтобы проверить разные атрибуты, чтобы вы могли решить, какую структуру использовать для реального безмаршалинга.

https://github.com/go-xmlpath/xmlpath/tree/v2

0

Вы можете распаковать на карту, потому что ваш ключ строка и значение может быть что-нибудь подобное - карта [строка] интерфейс {}. Если вы не уверены в каком-либо типе или значении данных, используйте интерфейс {} beacause, он может хранить любое значение. Затем используйте результат, чтобы увидеть, какая форма она есть, и десериализовать на определенный тип структуры.

Другой способ конвертировать JSON для перехода struct - это использовать этот инструмент. https://mholt.github.io/json-to-go/

Смежные вопросы