zoukankan      html  css  js  c++  java
  • .net5 中JsonConverter正确实现方式

    public class SmartObjectJsonConverter : JsonConverter<SmartObject>
    {
                public override SmartObject Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
                {
                    SmartObject obj = new SmartObject();
                    dynamic d = obj;
                    if (reader.TokenType==JsonTokenType.StartObject)
                    {
                        while (reader.Read())
                        {
                            switch (reader.TokenType)
                            {
                                case JsonTokenType.PropertyName:
                                    var propertyName = GetPropertyName(ref reader,options);
                                    reader.Read();//读取属性
                                    var propertyValue = GetPropertyValue(ref reader, options);
                                    d[propertyName] = propertyValue;
                                    break;
                                default:
                                    break;
                            }
                        }
                    }                
                    return obj;
                }
    
                private List<object> GetList(ref Utf8JsonReader reader, JsonSerializerOptions options)
                {
                    List<object> list = new List<object>();
                    while (reader.Read())
                    {
                        if (reader.TokenType != JsonTokenType.EndArray)
                        {
                            list.Add(GetPropertyValue(ref reader, options));
                        }
                        else
                        {
                            break;
                        }
                    }
                    return list;
                }
    
                private SmartObject GetObject(ref Utf8JsonReader reader, JsonSerializerOptions options)
                {
                    SmartObject obj = new SmartObject();
                    dynamic d = obj;
                    while (reader.Read())
                    {
                        if (reader.TokenType != JsonTokenType.EndObject)
                        {
                            var name = GetPropertyName(ref reader, options);
                            reader.Read();
                            var value = GetPropertyValue(ref reader, options);
                            d[name] = value;
                        }
                        else
                        {
                            break;
                        }
                    }
                    return obj;
                }
    
                private string GetPropertyName(ref Utf8JsonReader reader, JsonSerializerOptions options)
                {
                    return reader.GetString();
                }
    
                private object GetPropertyValue(ref Utf8JsonReader reader, JsonSerializerOptions options)
                {
                    switch (reader.TokenType)
                    {
                        case JsonTokenType.Null:
                            return null;
                        case JsonTokenType.StartArray:
                            return GetList(ref reader,options);
                        case JsonTokenType.StartObject:
                            return GetObject(ref reader,options);
                        case JsonTokenType.String:
                            DateTime time = default(DateTime);
                            Guid g = Guid.Empty;
                            if (reader.TryGetDateTime(out time))
                            {
                                return time;
                            }
                            else if (reader.TryGetGuid(out g))
                            {
                                return g;
                            }
                            else
                            {
                                return reader.GetString();
                            }
                        case JsonTokenType.Number:
                            sbyte sb; byte b; int i; short s; long l; decimal d; double db; float f;
                            if (reader.TryGetSByte(out sb))
                            {
                                return sb;
                            }
                            else if (reader.TryGetByte(out b))
                            {
                                return b;
                            }
                            else if (reader.TryGetInt16(out s))
                            {
                                return s;
                            }
                            else if (reader.TryGetInt32(out i))
                            {
                                return i;
                            }
                            else if (reader.TryGetInt64(out l))
                            {
                                return l;
                            }
                            else if (reader.TryGetSingle(out f))
                            {
                                return f;
                            }
                            else if (reader.TryGetDecimal(out d))
                            {
                                return d;
                            }
                            else if (reader.TryGetDouble(out db))
                            {
                                return db;
                            }
                            else
                            {
                                return 0;
                            }
                        case JsonTokenType.True:
                            return true;
                        case JsonTokenType.False:
                            return false;
                    }
                    return null;
                }
    
                public override void Write(Utf8JsonWriter writer, SmartObject value, JsonSerializerOptions options)
                {
                    if (value == null)
                    {
                        writer.WriteNullValue();
                    }
                    else
                    {
                        writer.WriteStartObject();
                        var properties = value.AsList();
                        foreach (var property in properties)
                        {
                            var val = property.Value;
                            writer.WritePropertyName(property.Key);
                            if (val == null)
                            {
                                writer.WriteNullValue();
                            }
                            else
                            {
                                WriteObject(writer,val,options);
                            }
                        }
                        writer.WriteEndObject();
                    }
                }
                private void WriteObject(Utf8JsonWriter writer, object value, JsonSerializerOptions options)
                {
                    if (value == null)
                    {
                        writer.WriteNullValue();
                    }
                    else
                    {
                        if (value is SmartObject)
                        {
                            Write(writer, value as SmartObject, options);
                        }
                        else
                        {
                            JsonSerializer.Serialize(writer, value, options);
                        }
                    }
                }
    }

    以上代码递归循环了各种属性。

  • 相关阅读:
    Basic GC Tuning
    程序员如何少走弯路,更好的提升技术。
    WPF 多线程
    IOC
    一句话概括WPF知识点
    WPF数据绑定 Binding
    WPF命令
    WPF依赖属性
    WPF路由事件
    WPF绘图和动画
  • 原文地址:https://www.cnblogs.com/kingge/p/JsonConverter.html
Copyright © 2011-2022 走看看