在使用Mongodb进行开发的过程中,遇到一些Bson序列化的问题,以及如何将Mongo的Bson格式转化为标准的Json格式。所以在此处记下一些遇到的问题及我认为并不完善的解决方法以供参考和回顾。
一、在Bson的ToJson方法中int类型表示为“Number(x)”,可以使用如下方法改变Bson对象序列化时的输出格式:
var jsonWriterSettings = new JsonWriterSettings { OutputMode = JsonOutputMode.Strict };
string bsonStr = bsonObj.ToJson(jsonWriterSettings);
得到的bsonStr就是标准Json格式的字符串。
二、如果字段的类型为Mongodb.Bson.ObjectId(在Mongodb数据库中_id为此类型),在使用实例化JsonWriterSetting设置输出的序列化格式后得到的Json字段形如:"_id":{"$oid":"xxxxxxxxxxxxxxxxxxxxxxxx"}。这个字段一般不需要在Json中体现出来。可以使用如下方法使某一字段在序列化时被忽略:
在字段上打上标签(Attribute):[BsonIgnore]
[BsonIgnore]
public ObjectId _id { get; set; }
但是仅仅这样的话,在反序列化时会因为缺少_id字段而无法成功反序列化对象。可在包含_id字段的类上打上标签[BsonIgnoreExtraElements]:
[BsonIgnoreExtraElements]
public class Enterprise
{
[BsonIgnore]
public ObjectId _id { get; set; }
}
三、json序列化时,如果时间类型中的毫秒是0,则在序列化时会被省略,采用JsonSerialzerSettings可以进行设置。
//设置不忽略时间的毫秒。
JsonSerializerSettings settings = new JsonSerializerSettings();
IsoDateTimeConverter dateConverter = new IsoDateTimeConverter
{
DateTimeFormat = "yyyy'-'MM'-'dd'T'HH':'mm':'ss.fff'Z'"
};
settings.Converters.Add(dateConverter);
string jsonStr = JsonConvert.SerializeObject(arr, settings);
//反序列化设置 忽略不可匹配的项
var jSetting = new JsonSerializerSettings();
jSetting.NullValueHandling = NullValueHandling.Ignore;
string devicejsonstr = FileHelper.GetContentFromFile(devicePath);
device = JsonConvert.DeserializeObject<List<Device>>(devicejsonstr, jSetting);
四、在使用Newtonsoft.Json进行序列化和反序列化时,可设置忽略项:
//反序列化设置 忽略不可匹配的项
var jSetting = new JsonSerializerSettings();
jSetting.NullValueHandling = NullValueHandling.Ignore;
device = JsonConvert.DeserializeObject<List<Device>>(jsonstr, jSetting);