json.net – 不要在没有setter的情况下序列化属性
发布时间:2020-12-16 18:40:55 所属栏目:百科 来源:网络整理
导读:我需要序列化包含具有getter但没有setter的属性的对象(OpenTK.Vector2).我希望一般可以忽略这些属性,否则我最终会从具有两个相关数据片段(X和Y)的对象中充分夸大 JSON. 代码: JsonSerializerSettings settings = new JsonSerializerSettings { ReferenceLoo
我需要序列化包含具有getter但没有setter的属性的对象(OpenTK.Vector2).我希望一般可以忽略这些属性,否则我最终会从具有两个相关数据片段(X和Y)的对象中充分夸大
JSON.
代码: JsonSerializerSettings settings = new JsonSerializerSettings { ReferenceLoopHandling = ReferenceLoopHandling.Ignore }; Vector2 v = new Vector2 { X = 1,Y = 0 }; string json = JsonConvert.SerializeObject(v,settings); 生成字符串: { "X" : 1.0,"Y" : 0.0,"Length" : 1.0,"LengthFast" : 1.0016948,"LengthSquared" : 1.0,"PerpendicularRight" : { "X" : 0.0,"Y" : -1.0,"PerpendicularRight" : { "X" : -1.0,"PerpendicularRight" : { "X" : 0.0,"Y" : 1.0,"LengthSquared" : 1.0 } },"Yx" : { "X" : -1.0,"LengthSquared" : 1.0 } } },"PerpendicularLeft" : { "X" : 0.0,"PerpendicularLeft" : { "X" : -1.0,"PerpendicularLeft" : { "X" : 0.0,"LengthSquared" : 1.0 },"Yx" : { "X" : 0.0,"LengthSquared" : 1.0 } } },"Yx" : { "X" : 0.0,"LengthSquared" : 1.0 } } } } 如何让序列化程序忽略这些其他属性? 解决方法
由于您无法修改OpenTK.Vector2结构以将[JsonIgnore]属性添加到get-only属性,因此最简单的方法可能是为其编写自己的
JsonConverter :
public class Vector2Converter : JsonConverter { public override bool CanConvert(Type objectType) { return objectType == typeof(OpenTK.Vector2); } public override object ReadJson(JsonReader reader,Type objectType,object existingValue,JsonSerializer serializer) { var temp = JObject.Load(reader); return new OpenTK.Vector2(((float?)temp["X"]).GetValueOrDefault(),((float?)temp["Y"]).GetValueOrDefault()); } public override void WriteJson(JsonWriter writer,object value,JsonSerializer serializer) { var vec = (OpenTK.Vector2)value; serializer.Serialize(writer,new { X = vec.X,Y = vec.Y}); } } 然后使用它像: var settings = new JsonSerializerSettings(); settings.Converters.Add(new Vector2Converter()); Vector2 v = new Vector2 { X = 1,Y = 0 }; string json = JsonConvert.SerializeObject(v,settings); Debug.WriteLine(json); 哪个产生
但是如果你真的想要忽略所有类和结构上的所有get-only属性(可能会产生无法预料的后果),请参见:Is there a way to ignore get-only properties in Json.NET without using JsonIgnore attributes?. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |