Join us Sept 17 at .local NYC! Use code WEB50 to save 50% on tickets. Learn more >
MongoDB Event
Menu Docs
Página inicial do Docs
/ / /
Driver GO
/

Formato de dados do documento: JSON estendido

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.

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.

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" }
}

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]}

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.

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"
]
}

Para saber mais sobre os métodos e tipos usados neste guia, consulte a seguinte documentação da API:

Voltar

BSON

Nesta página