Visão geral
JSON é um formato de dados que representa os valores de objetos, arrays, números, strings, booleans e nulos. O formato Extended JSON define um conjunto reservado de chaves prefixadas com o caractere $
para representar informações de tipos de campo que correspondem diretamente a cada tipo em BSON, o formato usado MongoDB para armazenar dados.
Formatos Extended JSON
O MongoDB Extended JSON apresenta diferentes formatos de string para representar dados BSON. Cada um dos formatos está em conformidade com o JSON RFC e atende a casos de uso específicos.
O formato estendido, também conhecido como formato canônico, apresenta representações específicas para cada tipo BSON para conversão bidirecional sem perda de informações. O formato Relaxed é mais conciso e semelhante ao JSON comum, mas não representa todas as informações de tipo, como o tamanho de byte específico de campos numéricos.
A tabela a seguir fornece descrições dos formatos JSON:
Nome | Descrição |
---|---|
Extended | Also known as the canonical format, this JSON representation avoids loss of
BSON type information. This format prioritizes type preservation at the loss of human-readability and
interoperability with older formats. |
Modo relaxado | JSON representation that describes BSON documents with some type information loss. This format prioritizes human-readability and interoperability at the loss of
certain type information. |
Shell | JSON representation that matches the syntax used in the MongoDB shell. This format prioritizes compatibility with the MongoDB shell, which often uses
JavaScript functions to represent types. |
Strict | Deprecated This representation is the legacy format that fully conforms to
the JSON RFC and allows any JSON parser to read the type information. |
Para saber mais sobre JSON, BSON e Extended JSON, consulte nosso artigo sobre JSON e BSON e a referência de Extended JSON no manual do MongoDB Server.
Exemplos de JSON estendido
As seguintes abas mostram um documento contendo um campo de ObjectId, data e número longo representado em cada formato Extended JSON. Selecione nas guias para ver os mesmos dados apresentados em cada formato JSON:
{ "_id": { "$oid": "573a1391f29313caabcd9637" }, "createdAt": { "$date": { "$numberLong": "1601499609" }}, "numViews": { "$numberLong": "36520312" } }
{ "_id": { "$oid": "573a1391f29313caabcd9637" }, "createdAt": { "$date": "2020-09-30T18:22:51.648Z" }, "numViews": 36520312 }
{ "_id": ObjectId("573a1391f29313caabcd9637"), "createdAt": ISODate("2020-09-30T18:22:51.648Z"), "numViews": NumberLong("36520312") }
{ "_id": { "$oid": "573a1391f29313caabcd9637" }, "createdAt": { "$date": 1601499609 }, "numViews": { "$numberLong": "36520312" } }
Ler Extended JSON
Você pode ler uma string de JSON estendida em uma estrutura ligando para o método bson.UnmarshalExtJSON()
. Este método analisa uma string de JSON estendida e armazena o resultado no parâmetro de valor especificado.
Este exemplo mostra como você pode ler uma string de JSON estendida na seguinte estrutura Person
:
type Person struct { ID bson.ObjectID `bson:"_id"` Name string Age int Birthday bson.DateTime Address Address Hobbies []string } type Address struct { Street string City string State string }
O código abaixo usa o método UnmarshalExtJSON()
para ler uma string de JSON estendida e desordenar os dados em uma instância de Person
:
var extJsonString = "{\"_id\":{\"$oid\":\"578f6fa2df35c7fbdbaed8c5\"},\"name\":\"Liana Ruiz\",\"age\":46,\"birthday\":{\"$date\":\"1988-01-15T00:00:00Z\"},\"address\":{\"street\":\"500 Slippery Rock Road\",\"city\":\"Round Rock\",\"state\":\"AR\"},\"hobbies\":[\"cycling\", \"baking\"]}" var p Person err := bson.UnmarshalExtJSON([]byte(extJsonString), false, &p) if err != nil { log.Fatal(err) } fmt.Printf("Go Struct Representation:\n%+v\n", p)
Go Struct Representation: {ID:ObjectID("578f6fa2df35c7fbdbaed8c5") Name:Liana Ruiz Age:46 Birthday:569203200000 Address:{Street:500 Slippery Rock Road City:Round Rock State:AR} Hobbies:[cycling baking]}
Escrever JSON estendido
Você pode produzir uma string de Extended JSON a partir de uma instância de uma estrutura ou documento BSON chamando o método bson.MarshalExtJSON()
. O exemplo abaixo cria uma string de Extended JSON no formato Relaxed a partir de uma estrutura ou de um documento BSON. Selecione a aba Struct ou bson.D para ver o exemplo correspondente :
var person = Person{ ID: bson.NewObjectID(), Name: "Matteo Carisi", Age: 49, Birthday: bson.NewDateTimeFromTime(time.Date(1975, 10, 30, 0, 0, 0, 0, time.UTC)), Address: Address{Street: "14a Corner Court", City: "Springfield", State: "IL"}, Hobbies: []string{"cooking", "birdwatching"}, } newExtJsonStringFromStruct, err := bson.MarshalExtJSON(person, false, true) if err != nil { log.Fatal(err) } fmt.Printf("Extended JSON Representation:\n%s\n", newExtJsonStringFromStruct)
Extended JSON Representation: {"_id":{"$oid":"686688fa7c1a2e75405f4697"},"name":"Matteo Carisi","age":49,"birthday":{"$date":"1975-10-30T00:00:00Z"},"address":{"street":"14a Corner Court","city":"Springfield","state":"IL"},"hobbies":["cooking","birdwatching"]}
bsonDocument := bson.D{{"hello", "world"}, {"number", 1}} newExtJsonStringFromBson, err := bson.MarshalExtJSON(bsonDocument, false, true) if err != nil { panic(err) } fmt.Printf("Extended JSON Representation:\n%s\n", newExtJsonStringFromBson)
Extended JSON Representation: {"hello":"world","number":1}
O segundo parâmetro para MarshalExtJSON()
determina se a string de saída está no formato canônico (estendido) ou formato relaxado. O exemplo anterior passa false
como o parâmetro canonical
, então a saída é JSON relaxado.
Observação
Datas anteriores à hora da época
Quando você empacota um valor de data que é anterior a 1 de janeiro, 1970, 00:00:00 UTC (horário de época), ele aparece como um carimbo de data/hora Unix em JSON relaxado. Se a data for posterior à hora da época, ela aparecerá em um formato de data legível.
Formatar Extended JSON
Você pode usar o método bson.MarshalExtJSONIndent()
para imprimir uma string de JSON estendida formatada que inclui novas linhas, prefixos e recuo.
O código a seguir usa o método MarshalExtJSONIndent()
para imprimir a string JSON do exemplo anterior formatada com dois espaços de recuo:
formattedString, err := bson.MarshalExtJSONIndent(person, false, true, "", " ") if err != nil { log.Fatal(err) } fmt.Printf("%s\n", formattedString)
{ "_id": { "$oid": "686688fa7c1a2e75405f4697" }, "name": "Matteo Carisi", "age": 49, "birthday": { "$date": "1975-10-30T00:00:00Z" }, "address": { "street": "14a Corner Court", "city": "Springfield", "state": "IL" }, "hobbies": [ "cooking", "birdwatching" ] }
Documentação da API
Para saber mais sobre os métodos e tipos usados neste guia, consulte a seguinte documentação da API: