Golang解析匿名元素JSON数组列表的方法
Golang解析匿名元素JSON数组列表的方法 我需要解析一个结构如下的JSON文件:
{
"posts": [
{
"no": 570368,
"sticky": 1,
"closed": 1,
"now": "12/31/18(Mon)17:05:48",
"name": "Anonymous",
"sub": "Welcome to /po/!",
"com": "Welcome to /po/! We specialize in origami, papercraft, and everything that’s relevant to paper engineering. This board is also an great library of relevant PDF books and instructions, one of the best resource of its kind on the internet.<br><br>Questions and discussions of papercraft and origami are welcome. Threads for topics covered by paper engineering in general are also welcome, such as kirigami, bookbinding, printing technology, sticker making, gift boxes, greeting cards, and more.<br><br>Requesting is permitted, even encouraged if it’s a good request; fulfilled requests strengthens this board’s role as a repository of books and instructions. However do try to keep requests in relevant threads, if you can.<br><br>/po/ is a slow board! Do not needlessly bump threads.",
"filename": "yotsuba_folding",
"ext": ".png",
"w": 530,
"h": 449,
"tn_w": 250,
"tn_h": 211,
"tim": 1546293948883,
"time": 1546293948,
"md5": "uZUeZeB14FVR+Mc2ScHvVA==",
"fsize": 516657,
"resto": 0,
"capcode": "mod",
"semantic_url": "welcome-to-po",
"replies": 2,
"images": 2,
"unique_ips": 1
},
{
"no": 570370,
"now": "12/31/18(Mon)17:14:56",
"name": "Anonymous",
"com": "<b>FAQs about papercraft</b><br>\n<br>\n<i>What paper should I use?</i><br>\n<br>\nSmall models can be made with light 100 to 150 gsm paper, while large ones are better with heavy 150 to 200+ gsm paper.<br>\n<br>\n<i>Where do I begin with papercraft can I find easy papercrafts?</i><br>\n<br>\nPapercraft also requires glue, and cutting tools. A PVA glue stick is works. A pen knife and cutting board is recommended, but otherwise scissors are okay for simple models.<br>\n<br>\nPapercraft normally involves printing and cutting out a number of nets, and and gluing tabs and pieces where appropriate to form a model.<br>\n<br>\nYou can find a variety of papercraft models on this board that may interest you. Ask for some otherwise, and be specific about what you would like. You can search online for ‘easy papercraft templates’, these links have many.<br>\n<br>\n<a href=\"http://papercraft.wikidot.com/papercraft\">http://papercraft.wikidot.com/paper<wbr>craft</a><br>\n<a href=\"http://cp.c-ij.com/en/categories/CAT-ST01-0071/top.html\">http://cp.c-ij.com/en/categories/CA<wbr>T-ST01-0071/top.html</a><br>\n<br>\n<i>What is Pepakura?</i><br>\n<br>\nPepakura Designer is a program that takes 3D models and `unfolds' them to papercraft templates. Using Pepakura in conjunction with a 3D modelling software, such as Blender, you can design your own papercraft models.<br>\n<br>\n<a href=\"https://elementcrafts.wordpress.com/2014/04/22/a-complete-beginners-guide-to-papercraft-pepakura-windows-only/\">https://elementcrafts.wordpress.com<wbr>/2014/04/22/a-complete-beginners-gu<wbr>ide-to-papercraft-pepakura-windows-<wbr>only/</a><br>\n<br>\n<i>Hints and tips?</i>\n<br>\nGlue accurately for a model to hold well, and practice plenty.<br>\n<br>\n<a href=\"http://www.papercraftmuseum.com/advanced-tutorial/\">http://www.papercraftmuseum.com/adv<wbr>anced-tutorial/</a><br>",
"filename": "papercraft faq",
"ext": ".png",
"w": 318,
"h": 704,
"tn_w": 56,
"tn_h": 125,
"tim": 1546294496751,
"time": 1546294496,
"md5": "0EqXBb4gGIyzQiaApMdFAA==",
"fsize": 285358,
"resto": 570368,
"capcode": "mod"
},
{
"no": 570371,
"now": "12/31/18(Mon)17:21:29",
"name": "Anonymous",
"com": "<b>FAQs about origami</b><br>\n<br>\n<i>Where do I begin with origami and how can I find easy models?</i><br>\n<br>\nTry browsing the board for guides, or other online resources listed below, for models you like and practice folding them.<br>\n<br>\nA great way to begin at origami is to participate in the Let’s Fold Together threads <a href=\"https://boards.4channel.org/po/catalog#s=lft\"><a href=\"//boards.4channel.org/po/catalog#s=lft\" class=\"quotelink\">>>>/po/lft</a></a> - open up the PDF file and find a model you like, work on it, and discuss or post results.<br>\n<br>\n<a href=\"http://en.origami-club.com\">http://en.origami-club.com</a><br>\n<a href=\"https://origami.me/diagrams/\">https://origami.me/diagrams/</a><br>\n<a href=\"https://www.origami-resource-center.com/free-origami-instructions.html\">https://www.origami-resource-center<wbr>.com/free-origami-instructions.html<wbr></a><br>\n<a href=\"http://www.paperfolding.com/diagrams/\">http://www.paperfolding.com/diagram<wbr>s/</a><br>\n<br>\n<i>What paper should I use?</i><br>\n<br>\nIt depends on the model; for smaller models which involved 25 steps or fewer, 15 by 15 cm origami paper from a local craft store will be suitable. For larger models you will need larger or thinner paper, possibly from online shops. Boxpleated models require thin paper, such as sketching paper. Wet folded models require thicker paper, such as elephant hide.<br>\n<br>\n<a href=\"https://www.origami-shop.com/en/\">https://www.origami-shop.com/en/</a><br>\n<br>\n<i>Hints and tips?</i><br>\n<br>\nFor folding, The best advice is to always fold as cleanly as possible, and take your time. Everything else comes with experience.<br>\n<br>\n<a href=\"https://origami.me/beginners-guide/\">https://origami.me/beginners-guide/<wbr></a><br>\n<a href=\"https://origamiusa.org/glossary\">https://origamiusa.org/glossary</a><br>\n<br>\n<i>What are ‘CPs’?</i><br>\n<br>\nCrease patterns are a structural representations of origami models, shown as a schematic of lines; they are essentially origami models unfolded and laid flat. Lines on a crease pattern may be indicated by ‘mountain’ or ‘valley’ folds to show how the folds alternate. If you’re particularly skilled at origami, they become useful instructions for building models. A common base fold is usually discernable, all the intermediate details can be worked on from there.<br>\n<br>\n<a href=\"https://blog.giladnaor.com/2008/08/folding-from-crease-patterns.html\">https://blog.giladnaor.com/2008/08/<wbr>folding-from-crease-patterns.html</a><br>\n<a href=\"http://www.origamiaustria.at/articles.php?lang=2#a4\">http://www.origamiaustria.at/articl<wbr>es.php?lang=2#a4</a><br>",
"filename": "origami faq",
"ext": ".jpg",
"w": 762,
"h": 762,
"tn_w": 125,
"tn_h": 125,
"tim": 1546294889019,
"time": 1546294889,
"md5": "vKWr7+oITdUBu7bUaypuCw==",
"fsize": 163110,
"resto": 570368,
"capcode": "mod"
}
]
}
目前我只关心获取每个项目中的 com 部分。到目前为止,我想到的代码如下:
type post struct {
Com string `json:"com"`
}
type posts []post
func main() {
resp, err := http.Get(os.Args[1]) // URI provided in command line
if err != nil {
panic(err)
}
jbytes, err := ioutil.ReadAll(resp.Body)
if err != nil {
panic(err)
}
var ps posts
json.Unmarshal(jbytes, &ps)
fmt.Printf("%#v", ps) // I need an array of `com`s
}
但它只打印出 []main.posts(nil)
更多关于Golang解析匿名元素JSON数组列表的方法的实战教程也可以访问 https://www.itying.com/category-94-b0.html
2 回复
好的,我修复了它。
type post struct {
Com string `json:"com"`
}
type posts struct {
Posts []post `json:"posts"`
}
func main() {
resp, err := http.Get(os.Args[1]) // 从命令行参数获取URI
if err != nil {
panic(err)
}
jbytes, err := ioutil.ReadAll(resp.Body)
if err != nil {
panic(err)
}
var ps posts
json.Unmarshal(jbytes, &ps)
fmt.Printf("%#v", ps) // 我需要一个 `com` 的数组
}
更多关于Golang解析匿名元素JSON数组列表的方法的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
你的代码没有正确映射JSON结构。JSON的根对象包含一个posts字段,该字段的值是数组。你需要定义一个包含Posts字段的结构体来匹配这个结构。
package main
import (
"encoding/json"
"fmt"
"io/ioutil"
"net/http"
"os"
)
type Post struct {
Com string `json:"com"`
}
type Response struct {
Posts []Post `json:"posts"`
}
func main() {
resp, err := http.Get(os.Args[1])
if err != nil {
panic(err)
}
defer resp.Body.Close()
jbytes, err := ioutil.ReadAll(resp.Body)
if err != nil {
panic(err)
}
var data Response
err = json.Unmarshal(jbytes, &data)
if err != nil {
panic(err)
}
// 提取所有com字段
for i, post := range data.Posts {
fmt.Printf("Post %d: %s\n", i, post.Com)
}
}
如果你只需要com字段,也可以使用匿名结构体:
func main() {
resp, err := http.Get(os.Args[1])
if err != nil {
panic(err)
}
defer resp.Body.Close()
jbytes, err := ioutil.ReadAll(resp.Body)
if err != nil {
panic(err)
}
var data struct {
Posts []struct {
Com string `json:"com"`
} `json:"posts"`
}
err = json.Unmarshal(jbytes, &data)
if err != nil {
panic(err)
}
for i, post := range data.Posts {
fmt.Printf("Post %d: %s\n", i, post.Com)
}
}
或者使用json.RawMessage进行部分解析:
func main() {
resp, err := http.Get(os.Args[1])
if err != nil {
panic(err)
}
defer resp.Body.Close()
jbytes, err := ioutil.ReadAll(resp.Body)
if err != nil {
panic(err)
}
var rawData map[string]json.RawMessage
err = json.Unmarshal(jbytes, &rawData)
if err != nil {
panic(err)
}
var posts []struct {
Com string `json:"com"`
}
err = json.Unmarshal(rawData["posts"], &posts)
if err != nil {
panic(err)
}
for i, post := range posts {
fmt.Printf("Post %d: %s\n", i, post.Com)
}
}

