您的位置:首页 > Web前端 > JavaScript

自定义 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);
}
}
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐