i'm using class base class enumerations: link created custom json.net converter handle enumerations when serializing/deserializing objects. serialization works fine, when try deserialize object has enumeration collection property, json.net throws serializationexception following message:
unexpected end when deserializing array. path '', line 11, position 2.
update : here classes cutdown version of enumeration class.
public class program { static void main(string[] args) { var employee = new employee { name="asd", types = new list<employeetype>() { employeetype.assistanttotheregionalmanager, employeetype.manager, employeetype.servant } }; var json = jsonconvert.serializeobject(employee, new enumerationtypeconverter()); var deserializedemployee=jsonconvert.deserializeobject<employee>(json,new enumerationtypeconverter()); } } public class employee { public string name { get; set; } public list<employeetype> types { get; set; } } public class employeetype : enumeration { public static readonly employeetype manager = new employeetype(0, "manager"); public static readonly employeetype servant = new employeetype(1, "servant"); public static readonly employeetype assistanttotheregionalmanager = new employeetype(2, "assistant regional manager"); public employeetype() { } private employeetype(int value, string displayname) : base(value, displayname) { } } public class enumerationtypeconverter : jsonconverter { public override void writejson(jsonwriter writer, object value, jsonserializer serializer) { writer.writevalue((value enumeration).value); } public override object readjson(jsonreader reader, type objecttype, object existingvalue, jsonserializer serializer) { int? value = reader.readasint32(); return value.hasvalue ? enumeration.fromvalue(value.value, objecttype) : null; } public override bool canconvert(type objecttype) { return objecttype.issubclassof(typeof(enumeration)); } } public abstract class enumeration { public int value { get; set; } public string displayname { get; set; } protected enumeration(int value, string displayname) { value = value; displayname = displayname; } public static ienumerable<enumeration> getall(type type) { var fields = type.getfields(bindingflags.public | bindingflags.static | bindingflags.declaredonly); foreach (var fieldinfo in fields) { yield return fieldinfo.getvalue(null) enumeration; } } public static object fromvalue(int value, type type) { return getall(type).firstordefault(p => p.value == value); } }
what doing wrong?
jsonreader.readasint32()
reads next json token stream. want value of current token. do:
var value = (int?)jtoken.load(reader);
Comments
Post a Comment