zoukankan      html  css  js  c++  java
  • MongoDb C# ObjectId序列化问题处理-11

    在MongoDB中OjbectId 类型Json序列化反序列化会出错,可以通过以下两种方式解决

    1、最简单粗暴的方法,从新定一个一个业务主键比如key,这样的话等于之前的_id不起作用了

    2、使用JsonConverter

     public class ObjectIdConverter : JsonConverter
        {
            public override bool CanConvert(Type objectType)
            {
                return objectType == typeof(ObjectId);
            }
    
            public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
            {
                if (reader.TokenType != JsonToken.String)
                {
                    throw new Exception(
                        String.Format("Unexpected token parsing ObjectId. Expected String, got {0}.",
                                      reader.TokenType));
                }
    
                var value = (string)reader.Value;
                return String.IsNullOrEmpty(value) ? ObjectId.Empty : new ObjectId(value);
            }
    
            public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
            {
                if (value is ObjectId)
                {
                    var objectId = (ObjectId)value;
    
                    writer.WriteValue(objectId != ObjectId.Empty ? objectId.ToString() : String.Empty);
                }
                else
                {
                    throw new Exception("Expected ObjectId value.");
                }
            }
        }
    

      

    在ObjectId字段上加一行代码即可

    [JsonConverter(typeof(ObjectIdConverter))]
    public string _id { get; set; }
    

    如果使用Newtonsoft的JsonConvert的话,还需要额外加上参数

    JsonConvert.DeserializeObject<xxxx>(json,new ObjectIdConverter());

    3、通过Ignore,一种很有技巧性的写法

    [JsonIgnore]
    public override  ObjectId _Id { get; set; }
    
    [BsonIgnore]
    public string _IdStr
    {
         get
         {
              return Id.ToString();
         }
         set
         {
              ObjectId id;
              ObjectId.TryParse(value, out id);
              Id = id;
         }
    }
    

      

    4、如果使用第二种方式,提交数据时注意

     如果_id留空时,要使用"_id": "",而不是"_id": {};

    1、建了一个小群:616945527(软件), 欢迎大家加入,加群口令abc123,硬件嵌入式开发者推荐75764412(单片机)。
    闲置域名www.nsxz.com出售(等宽等高字符四字域名,可组合多种有意义词语)。
  • 相关阅读:
    [LeetCode]2. Add Two Numbers链表相加
    Integration between Dynamics 365 and Dynamics 365 Finance and Operation
    向视图列添加自定义图标和提示信息 -- PowerApps / Dynamics365
    Update the Power Apps portals solution
    Migrate portal configuration
    Use variable to setup related components visible
    Loyalty management on Retail of Dynamic 365
    Modern Fluent UI controls in Power Apps
    Change screen size and orientation of a canvas app in Power App
    Communication Plan for Power Platform
  • 原文地址:https://www.cnblogs.com/zhaogaojian/p/14385228.html
Copyright © 2011-2022 走看看