我的要求是在反序列化过程中使用JsonProperty并在序列化过程中忽略JsonProperty。我的模型,使用自定义JsonConverter和自定义ContractResolver时StackOverflow异常
[JsonConverter(typeof(JsonPathConverter))]
public class FacebookFeed
{
public FacebookFeed()
{
Posts = new List<FacebookFeedPost>();
}
[JsonProperty("name")]
public string Name { get; set; }
[JsonProperty("fan_count")]
public int Likes { get; set; }
[JsonProperty("feed.data")]
public List<FacebookFeedPost> Posts { get; set; }
}
public class FacebookFeedPost
{
[JsonProperty("id")]
public string Id { get; set; }
[JsonProperty("message")]
public string Message { get; set; }
[JsonProperty("created_time")]
public DateTime Date { get; set; }
[JsonProperty("comments.summary.total_count")]
public int Comments { get; set; }
}
class IgnoreJsonPropertyContractResolver : DefaultContractResolver
{
protected override IList<JsonProperty> CreateProperties(Type type, MemberSerialization memberSerialization)
{
var list = base.CreateProperties(type, memberSerialization);
foreach (JsonProperty prop in list)
{
prop.PropertyName = prop.UnderlyingName;
}
return list;
}
}
public class JsonPathConverter : JsonConverter
{
public override object ReadJson(JsonReader reader, Type objectType,
object existingValue, JsonSerializer serializer)
{
var jo = JObject.Load(reader);
object targetObj = Activator.CreateInstance(objectType);
foreach (var prop in objectType.GetProperties()
.Where(p => p.CanRead && p.CanWrite))
{
var att = prop.GetCustomAttributes(true).OfType<JsonPropertyAttribute>().FirstOrDefault();
var jsonPath = (att != null ? att.PropertyName : prop.Name);
var token = jo.SelectToken(jsonPath);
if (token != null && token.Type != JTokenType.Null)
{
var value = token.ToObject(prop.PropertyType, serializer);
prop.SetValue(targetObj, value, null);
}
}
return targetObj;
}
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
var s = new JsonSerializer();
serializer.ContractResolver = new IgnoreJsonPropertyContractResolver();
var t = JToken.FromObject(value, s);
t.WriteTo(writer);
}
public override bool CanConvert(Type objectType)
{
// CanConvert is not called when [JsonConverter] attribute is used
return false;
}
public override bool CanWrite
{
get { return true; }
}
}
问题是WriteJson。请注意,我使用内部序列化我的对象的ASP.NET Web Api,这就是为什么我使用JsonConverter。我不想改变全球网络API设置。
哪里是异常提出的准确?你有调用堆栈吗? – themiurge
'var t = JToken.FromObject(value,s);'在这一行。无堆栈跟踪。 – user960567
你的问题是,转换器正在递归调用自己。由于它直接应用于该类型,对JToken.FromObject(value,s);的内部调用将调用转换器第二个实例的WriteJson()。 [JSON.Net在使用[JsonConvert()]'](https://stackoverflow.com/q/29719509/3744182)时抛出StackOverflowException异常可以避免出现这种情况。 – dbc