自定义 jsonConverter的问题记录

来源:互联网 发布:windows彩蛋星球大战 编辑:程序博客网 时间:2024/06/10 08:59
using System;using System.Collections.Generic;using System.Linq;using System.Text;using Newtonsoft.Json;using Newtonsoft.Json.Linq;namespace ConsoleApplication1{    public class A    {        public string Title = "A Title";        [JsonConverter(typeof(ConsoleApplication1.Program.custConverter))]        public List<answerBase> baseAnswerList = new List<answerBase>();    }    public class answerA : answerBase    {        public List<int> value = new List<int>() { 1, 2, 3 };    }    public class answerB : answerBase    {        public List<string> Correct = new List<string>() { "1111", "2222" };        public List<string> Incorrect = new List<string>() { "3333", "4444" };    }    class Program    {        static void Main(string[] args)        {            JsonSerializerSettings jsonSerializerSettings = new JsonSerializerSettings();            jsonSerializerSettings.TypeNameHandling = TypeNameHandling.Objects;            var test1 = new A();            test1.baseAnswerList.Add(new answerA());            var result = JsonConvert.SerializeObject(test1, jsonSerializerSettings);            var test2 = new A();            test2.baseAnswerList.Add(new answerB());            var result2 = JsonConvert.SerializeObject(test2, jsonSerializerSettings);            A a = (A)JsonConvert.DeserializeObject(result, jsonSerializerSettings);            A a1 = (A)JsonConvert.DeserializeObject(result2, jsonSerializerSettings);            List<A> testAList = new List<A>();            testAList.Add(test1);            testAList.Add(test2);            var resultList = JsonConvert.SerializeObject(testAList, jsonSerializerSettings);            var deserializeResult = JsonConvert.DeserializeObject(resultList, jsonSerializerSettings);        }        public class custConverter : JsonConverter        {            public override bool CanConvert(Type objectType)            {                return true;            }            public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)            {                bool isError = false;                try                {                    List<int> retValTest1 = new List<int>();                    retValTest1 = (List<int>)serializer.Deserialize(reader, typeof(List<int>));                    var t1 = new List<answerBase>();                    var a1 = new answerA();                    a1.value = retValTest1;                    t1.Add(a1);                    return t1;                }                catch                {                    isError = true;                }                if (isError)                {                    try                    {                        var retVal = new List<answerB>();                        retVal = (List<answerB>)serializer.Deserialize(reader, typeof(List<answerB>));                        var t = new List<answerBase>();                        foreach (var item in retVal)                        {                            t.Add(new answerB()                            {                                Correct = item.Correct.Distinct().ToList(),                                Incorrect = item.Incorrect.Distinct().ToList()                            });                        }                        return t;                    }                    catch                    {                        isError = true;                    }                }                return null;            }            //public override bool CanRead            //{            //    get { return false; }            //}            public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)            {                if (value == null)                {                    writer.WriteNull();                    return;                }                bool bValue = false;                answerBase temp = new answerBase();                if (((List<answerBase>)value).Count() > 0)                {                    temp = ((List<answerBase>)value).First();                    bValue = temp is answerA;                }                if (bValue)                {                    var tempA = temp as answerA;                    writer.WriteStartArray();                    foreach (var item in tempA.value)                    {                        writer.WriteValue(item);                    }                    writer.WriteEndArray();                }                else                {                    JToken t = JToken.FromObject(value);                    t.WriteTo(writer);                }            }        }    }}

0 0