[C#] 一個輕量化的Database - LiteDB 關於 BsonValue 轉回物件問題

2024-01-29

今天來說一個在嘗試 LiteDB 的時候遇到的錯誤,因為該套件的底層是使用 BSON ,所以在還原回物件的時候

他預設都是 LiteDB.BsonValue  ,因為我直接下一個查詢語法後直接使用 Json.NET , SerializeObject 的時候直接出現錯誤

Unhandled exception. Newtonsoft.Json.JsonSerializationException: Error getting value from 'AsBoolean' on 'LiteDB.BsonValue'.

 ---> System.InvalidCastException: Unable to cast object of type 'System.String' to type 'System.Boolean'.

   at lambda_method23(Closure, Object)

   at Newtonsoft.Json.Serialization.ExpressionValueProvider.GetValue(Object target)

   --- End of inner exception stack trace ---


這邊我直接對 DB 下指令 關於 %LIKE% 的作法,我期許的是他撈回來的時候就會是該物件,但是其實不是而且直接使用萬用的

Json.NET 也會出現錯誤

下面是會出現錯誤的 code:

//%LIKE% 使用 類SQL 語法查詢 using (var db = new LiteDatabase(AppDomain.CurrentDomain.BaseDirectory + "sample.db")) { var data1 = db.Execute("SELECT $ FROM FRIENDS WHERE Name LIKE '%IEND999%'").ToArray(); if (data1 != null) { foreach (var data in data1) { Console.WriteLine(JsonConvert.SerializeObject(data)); } Console.WriteLine(); Console.WriteLine("Count:" + data1.Length); } } //Error /* handled exception. Newtonsoft.Json.JsonSerializationException: Error getting value from 'AsBoolean' on 'LiteDB.BsonValue'. ---> System.InvalidCastException: Unable to cast object of type 'System.String' to type 'System.Boolean'. at lambda_method23(Closure, Object) at Newtonsoft.Json.Serialization.ExpressionValueProvider.GetValue(Object target) --- End of inner exception stack trace --- at Newtonsoft.Json.Serialization.ExpressionValueProvider.GetValue(Object target) at Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.CalculatePropertyValues(JsonWriter writer, Object value, JsonContainerContract contract, JsonProperty member, JsonProperty property, JsonContract& memberContract, Object& memberValue) at Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.SerializeObject(JsonWriter writer, Object value, JsonObjectContract contract, JsonProperty member, JsonContainerContract collectionContract, JsonProperty containerProperty) at Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.SerializeValue(JsonWriter writer, Object value, JsonContract valueContract, JsonProperty member, JsonContainerContract containerContract, JsonProperty containerProperty) at Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.SerializeDictionary(JsonWriter writer, IDictionary values, JsonDictionaryContract contract, JsonProperty member, JsonContainerContract collectionContract, JsonProperty containerProperty) at Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.SerializeValue(JsonWriter writer, Object value, JsonContract valueContract, JsonProperty member, JsonContainerContract containerContract, JsonProperty containerProperty) at Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.Serialize(JsonWriter jsonWriter, Object value, Type objectType) */


後來研究一下,因為他預設會是回來 LiteDB.BsonValue 所以我們必須要把他轉回原本的物件

後來的修正

//%LIKE% 使用 類SQL 語法查詢 using (var db = new LiteDatabase(AppDomain.CurrentDomain.BaseDirectory + "sample.db")) { var data1 = db.Execute("SELECT $ FROM FRIENDS WHERE Name LIKE '%IEND999%'").ToArray(); if (data1 != null) { foreach (var data in data1) { Console.WriteLine(JsonConvert.SerializeObject(BsonMapper.Global.Deserialize<Friend>(data))); } Console.WriteLine(); Console.WriteLine("Count:" + data1.Length); } }


花了我一點時間找錯誤

reference:

https://www.litedb.org/docs/data-structure/




當麻許的碎念筆記 2014 | Donma Hsu Design.