【问题标题】:Mongo DB object Id deserializing using JSON serializer使用 JSON 序列化程序反序列化 Mongodb 对象 Id
【发布时间】:2021-05-11 03:33:39
【问题描述】:
var docToJson = doc.ToJson<BsonDocument>();
story Featured = JsonConvert.DeserializeObject<story>(docToJson);


public class story 
{
[JsonProperty("_id"), JsonConverter(typeof(ObjectIdConverter))]
public ObjectId Id { get; set; }
....

public class ObjectIdConverter : JsonConverter
{
        public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
        {
            serializer.Serialize(writer, value.ToString());
        }

        public override object ReadJson(JsonReader reader, Type objectType, object existingValue,        

 JsonSerializer serializer)
        {
            JToken token = JToken.Load(reader);
            return new ObjectId(token.ToObject<string>());
        }

        public override bool CanConvert(Type objectType)
        {
            return (objectType == typeof(ObjectId));
        }
      }
    }

我被困住了,我已经尝试了六种方法,但我仍然在使用 json 阅读器时遇到同样的错误,有人有什么想法吗?

上次尝试这个来自SO*

JsonReader 异常

解析值时遇到意外字符:O. 路径“_id”,第 1 行,位置 10。

JSON 字符串如下所示:

{
    "_id": ObjectId("5378f94a3513fa3374be7e20"),
    "cc": "GB",
    "userName": "xyz ",
    "userImage": "img/16.jpg",
    "createdDate": ISODate("2014-05-18T18:17:46.983Z"),
    "Headling": "Veniam, amet, incidunt veniam, ipsam nostrud natus exercitationem consectetur, eos dolorem. ",
    "subheading": "Veniam, amet, incidunt veniam, ipsam nostrud. "
}

【问题讨论】:

  • 请发布您尝试反序列化的 JSON 字符串。
  • 嗨,它来自数据库,看起来像这样 { "_id" : ObjectId("5378f94a3513fa3374be7e20"), "cc" : "GB", "userName" : "xyz ", "userImage" : "img/16.jpg", "createdDate" : ISODate("2014-05-18T18:17:46.983Z"), "Headling" : "Veniam, amet, incidunt veniam, ipsam nostrud natus exercitationem consectetur, eos dolorem。 ", "副标题" : "Veniam, amet, 事件 veniam, ipsam nostrud。" }

标签: c# mongodb azure json.net deserialization


【解决方案1】:

您收到此错误是因为 _id 属性的值不符合 JSON 标准(请参阅 JSON.org)。 JSON 值必须是以下之一:

  • 一个字符串(以引号"开头和结尾)
  • 一个数字
  • 一个对象(以花括号 {} 开头和结尾)
  • 一个数组(以方括号[] 开头和结尾)
  • 关键字truefalsenull

ObjectId("5378f94a3513fa3374be7e20") 似乎是一个无效的函数。值ISODate("2014-05-18T18:17:46.983Z") 有同样的问题。如果您想使用 JSON.net 解析它,您将需要以某种方式更改您的 JSON 以符合标准。

【讨论】:

  • +1 表示技术上正确,这是 DB (BSON) 格式,奇怪的是 BSON 确实转换为 JSON var docToJson = doc.ToJson();只是无法用 JSON.NET 反序列化,感谢您的帮助,一定有办法,这里有几个指针,无法让它们中的任何一个工作
  • 如果你从 BSON 开始,为什么不直接反序列化而不是先尝试将其转换为 JSON?也许是doc.ToJson 导致了问题。 Json.Net 文档中有 an example 说明如何反序列化 BSON。
  • 哇,不知道它的存在,太棒了,谢谢布赖恩,你为我省去了一些麻烦!!!
【解决方案2】:

问题在于 MongoDB Bson 序列化输出不会将对象转换为 Json.Net 预期的普通 Json。 幸运的是,可以将 BsonDocument 转换为 .Net 对象,然后将该对象序列化为 Json。

object dotnetObject = BsonTypeMapper.MapToDotNetValue(bsonDocument);

// Json mapped to default .Net objects
string json = Newtonsoft.Json.JsonConvert.SerializeObject(dotnetObject);

// Parsing as JObject
var jobject = JObject.Parse(json);

// Deserializing as your custom Type
var myObject = JsonConvert.DeserializeObject<MyType>(json);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-20
    • 2016-10-12
    • 1970-01-01
    • 1970-01-01
    • 2016-12-30
    • 1970-01-01
    相关资源
    最近更新 更多