// Convert implements the Converter interface for JSON input. It converts a // JSONConverter struct to a BSON document. func (c JSONConverter) Convert() (bson.D, error) { document, err := json.UnmarshalBsonD(c.data) if err != nil { return nil, fmt.Errorf("error unmarshaling bytes on document #%v: %v", c.index, err) } log.Logvf(log.DebugHigh, "got line: %v", document) bsonD, err := bsonutil.GetExtendedBsonD(document) if err != nil { return nil, fmt.Errorf("error getting extended BSON for document #%v: %v", c.index, err) } log.Logvf(log.DebugHigh, "got extended line: %#v", bsonD) return bsonD, nil }
// MetadataFromJSON takes a slice of JSON bytes and unmarshals them into usable // collection options and indexes for restoring collections. func (restore *MongoRestore) MetadataFromJSON(jsonBytes []byte) (bson.D, []IndexDocument, error) { if len(jsonBytes) == 0 { // skip metadata parsing if the file is empty return nil, nil, nil } meta := &Metadata{} err := json.Unmarshal(jsonBytes, meta) if err != nil { return nil, nil, err } // first get the ordered key information for each index, // then merge it with a set of options stored as a map metaAsMap := metaDataMapIndex{} err = json.Unmarshal(jsonBytes, &metaAsMap) if err != nil { return nil, nil, fmt.Errorf("error unmarshalling metadata as map: %v", err) } for i := range meta.Indexes { // remove "key" from the map so we can decode it properly later delete(metaAsMap.Indexes[i], "key") // parse extra index fields meta.Indexes[i].Options = metaAsMap.Indexes[i] if err := bsonutil.ConvertJSONDocumentToBSON(meta.Indexes[i].Options); err != nil { return nil, nil, fmt.Errorf("extended json error: %v", err) } // parse the values of the index keys, so we can support extended json for pos, field := range meta.Indexes[i].Key { meta.Indexes[i].Key[pos].Value, err = bsonutil.ParseJSONValue(field.Value) if err != nil { return nil, nil, fmt.Errorf("extended json in '%v' field: %v", field.Name, err) } } } // parse the values of options fields, to support extended json meta.Options, err = bsonutil.GetExtendedBsonD(meta.Options) if err != nil { return nil, nil, fmt.Errorf("extended json in 'options': %v", err) } return meta.Options, meta.Indexes, nil }