2016-10-11 3 views
1

Я только недавно начал работать с apis и http-запросами, и я пытаюсь создать приложение, которое использует Reddit API, чтобы вытаскивать сообщения по определенному субреддите.Unmarshalling Complex Json

Это страница с JSon и поиска параметров, которые я упражняюсь на: https://www.reddit.com/r/hiphopheads.json?limit=1

Глядя на стандартную библиотеку модуля JSON для Golang, я до сих пор не понимаю, как использовать JSON. Unmarshal для этого сложного JSON. Из того, что я понимаю, что я должен определить структуру, которая напоминает структуру JSON на самом деле держать данные

Я разместил ссылку на этот сайт, чтобы получить представление о том, что JSON фактически strucutred как: https://jsonformatter.curiousconcept.com/

Прямо сейчас главное, что мне нужно, - это название, которое находится в разделе «Данные -> Дети -> Данные -> Название. Если я хочу размонтировать JSON в объект, я могу определить вложенный объект struct? Или есть более простой способ сделать это, чтобы мне не приходилось выяснять все атрибуты JSON и сами определять их?

Любая помощь, которая может помочь мне на правильном пути, очень ценится. Благодаря!

ответ

2

Вам не нужно определять поля, которые вам не нужны в вашей структуре. Unmarshal будет расшифровывать только те значения, которые присутствуют в вашей структуре. Но с вложенными JSON вы, к сожалению, также должны определить все родительские поля (в отличие от пакета xml, в котором вы можете определить пути в тегах). Так что ваша структура может выглядеть следующим образом:

type Foo struct { 
    Data struct { 
     Children []struct { 
      Data struct { 
       Title string 
      } 
     } 
    } 
} 

Смотрите здесь для рабочего примера: https://play.golang.org/p/UeUYfWBONL

+0

Спасибо за ответ, очень простой и лаконичный. Я тоже мало разбираюсь в XML, но я думаю, что посмотрю, как он отличается от JSON. – calmeishmael

+0

Разница заключается в том, что в пакете xml, если вы хотите декодировать вложенные значения, вы можете поместить пути в теги следующим образом: 'type Foo struct {Title string 'xml:" data> children> data> title "'}' Не знаю, почему это невозможно в пакете json, поскольку это действительно удобно, нужно только определить одну структуру (вместо этого в этом случае - 4). В противном случае пакет действительно аналогичен – jussius

0

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

Существует несколько инструментов, которые генерируют определения структур из JSON, и это экономит массу работы. Использование JSON вас в курсе и such an online tool, я создал следующую структуру:

package main 

type MyJsonName struct { 
    Data struct { 
     After string  `json:"after"` 
     Before interface{} `json:"before"` 
     Children []struct { 
      Data struct { 
       ApprovedBy   interface{} `json:"approved_by"` 
       Archived   bool   `json:"archived"` 
       Author    string  `json:"author"` 
       AuthorFlairCSSClass string  `json:"author_flair_css_class"` 
       AuthorFlairText  interface{} `json:"author_flair_text"` 
       BannedBy   interface{} `json:"banned_by"` 
       Clicked    bool   `json:"clicked"` 
       ContestMode   bool   `json:"contest_mode"` 
       Created    int   `json:"created"` 
       CreatedUtc   int   `json:"created_utc"` 
       Distinguished  string  `json:"distinguished"` 
       Domain    string  `json:"domain"` 
       Downs    int   `json:"downs"` 
       Edited    bool   `json:"edited"` 
       Gilded    int   `json:"gilded"` 
       Hidden    bool   `json:"hidden"` 
       HideScore   bool   `json:"hide_score"` 
       ID     string  `json:"id"` 
       IsSelf    bool   `json:"is_self"` 
       Likes    interface{} `json:"likes"` 
       LinkFlairCSSClass string  `json:"link_flair_css_class"` 
       LinkFlairText  string  `json:"link_flair_text"` 
       Locked    bool   `json:"locked"` 
       Media    interface{} `json:"media"` 
       MediaEmbed   struct{}  `json:"media_embed"` 
       ModReports   []interface{} `json:"mod_reports"` 
       Name    string  `json:"name"` 
       NumComments   int   `json:"num_comments"` 
       NumReports   interface{} `json:"num_reports"` 
       Over18    bool   `json:"over_18"` 
       Permalink   string  `json:"permalink"` 
       Quarantine   bool   `json:"quarantine"` 
       RemovalReason  interface{} `json:"removal_reason"` 
       ReportReasons  interface{} `json:"report_reasons"` 
       Saved    bool   `json:"saved"` 
       Score    int   `json:"score"` 
       SecureMedia   interface{} `json:"secure_media"` 
       SecureMediaEmbed struct{}  `json:"secure_media_embed"` 
       Selftext   string  `json:"selftext"` 
       SelftextHTML  string  `json:"selftext_html"` 
       Stickied   bool   `json:"stickied"` 
       Subreddit   string  `json:"subreddit"` 
       SubredditID   string  `json:"subreddit_id"` 
       SuggestedSort  interface{} `json:"suggested_sort"` 
       Thumbnail   string  `json:"thumbnail"` 
       Title    string  `json:"title"` 
       Ups     int   `json:"ups"` 
       URL     string  `json:"url"` 
       UserReports   []interface{} `json:"user_reports"` 
       Visited    bool   `json:"visited"` 
      } `json:"data"` 
      Kind string `json:"kind"` 
     } `json:"children"` 
     Modhash string `json:"modhash"` 
    } `json:"data"` 
    Kind string `json:"kind"` 
} 

Обычно, выход из этих инструментов все еще нуждается в ручную настройку, чтобы работать должным образом. например:

MediaEmbed   struct{}  `json:"media_embed"` 

Я уверен, что это не то, что нужно здесь. Но это долгий путь в том, чтобы показать основную идею и правильно понять большую часть материала. Есть и другие подобные инструменты, которые вы можете попробовать.

+0

Спасибо за ответы. Инструмент кажется очень полезным и, безусловно, поможет в будущем работать с JSON. Еще раз спасибо. – calmeishmael

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