【问题标题】:JSON.NET strongly typed object inheriting from DynamicObject deserialization/serializationJSON.NET 强类型对象继承自 DynamicObject 反序列化/序列化
【发布时间】:2014-01-06 17:08:28
【问题描述】:

C#
给定:

[JsonObject(MemberSerialization.OptOut)]
公共类客户:DynamicObject{

公共字符串名字 { 获取;放; }
公共字符串姓氏{得到;放; }

}

JavaScript:
var 客户 = {
名字:“约翰”,
姓氏:“Doe”,
出生日期:“1984 年 12 月 18 日”
};

在 JSON.NET 中是否有设置或其他必须发生的设置,以便在将 json 发布到服务器时将 DOB 反序列化为强类型 Customer?

【问题讨论】:

  • 我还没有解决这个问题。

标签: dynamic json.net deserialization


【解决方案1】:

要使其正常工作,请使用覆盖 ReadJson 和 WriteJson 方法的自定义转换器

公共类 CustomConverter : JsonConverter{

    public override void WriteJson(JsonWriter writer,
                                   object value,
                                   JsonSerializer serializer)
    {
        if (value is DynamicSword)
        {
            var ds = (DynamicSword)value;
            string[] serializable;
            string[] notSerializable;
            ds.SetSerializableAndNotSerializable(out serializable, out notSerializable);                
            var jobject = new JObject();
            foreach (var item in serializable)
            {
                var tempValue = ds[item];
                if (tempValue != null)
                {   
                    jobject.Add(item, JToken.FromObject(tempValue));
                }
            }
            jobject.WriteTo(writer);
        }
        else
        {
            JToken t = JToken.FromObject(value);
            t.WriteTo(writer);
        }
    }


    public override bool CanConvert(Type objectType)
    {
        return true;     
    }

    public override object ReadJson(JsonReader reader,
                                    Type objectType,
                                     object existingValue,
                                     JsonSerializer serializer)
    {
        ConstructorInfo magicConstructor = objectType.GetConstructor(Type.EmptyTypes);
        var newObject = magicConstructor.Invoke(new object[]{});
        JObject jObject = JObject.Load(reader);
        if (newObject is DynamicSword)
        {
            var ds = (DynamicSword)newObject;
            hydrate(jObject, ds);
        }
        else
        {
            //do something different?
            //really shoulnt be in here anyways
        }
        return newObject;
    }

....

}

【讨论】:

  • 这还远未完成,但它表明可以使用 JSON.NET 轻松完成。
  • [JsonConverter(typeof(CustomConverter))] public class TestClass1 : DynamicSword 必须将 JsonConverter 的属性放在类上。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多