我的要求是在反序列化過程中使用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