自定义 jsonConverter的问题记录
2016-09-29 13:26
375 查看
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); } } } } }
相关文章推荐
- [项目过程中所遇到的各种问题记录]编辑器篇——FCKeditor自定义上传路径配置
- Python:通过自定义系统级快捷键来控制程序开始或停止记录日志(使用小技巧解决一个貌似无解的问题)
- 日常问题记录--jquery中HTML元素本身固有属性用prop,自定义的DOM属性,在处理时,使用attr方法
- 关于获取JSON数据,出现格式错误的问题记录
- 自定义Retrofit的Converter使其去除json中非法字符
- AJAX JSON中日期类型DateTime格式化的序列化自定义对象以及自定义类型参数的问题处理
- android retrofit 实战自定义converter,解决相同接口返回不同数据的问题
- 自定义ListView item包含checkbox实现单选记录自己开发是遇到的问题
- 记录自己的Json反序列化问题
- android retrofit 实战自定义converter,解决相同接口返回不同数据的问题
- 当自定义数据属性为json格式字符串时jQuery的data api问题探讨
- ext的Ext.data.JsonStore不自动获取数据的问题记录
- <记录模板学习的问题>标准库提供的swap与自定义的swap冲突
- android 解决自定义actionbar左右两边有间距问题记录
- 关于自定义view使用,命名空间问题,记录而已
- Python:通过自定义系统级快捷键来控制程序开始或停止记录日志(使用小技巧解决一个貌似无解的问题)
- Android自定义键盘问题记录
- php处理JSON等小问题记录
- Android Retrofit 2.0自定义JSONObject Converter
- android retrofit 实战自定义converter,解决相同接口返回不同数据的问题