2017-02-03 32 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

Unmarshal部分,然后检查键和决定下一步该做什么。类似的问题http://stackoverflow.com/questions/11066946/partly-json-unmarshal-into-a-map-in-go –

+0

可能重复[部分JSON解组成一个地图在Go](http:// stackoverflow。 COM /问题/ 11066946 /部分,JSON-解组到-A-MAP-在-GO) – 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

可以解组映射,因为你的关键是字符串值可能会像什么 - 图[字符串]接口{}。如果您不确定任何数据类型或值,请使用interface {},因为它可以存储任何值。然后使用结果来查看它是哪种形式,并反序列化为特定的结构类型。

将JSON转换为结构的另一种方法是使用此工具。 https://mholt.github.io/json-to-go/