我找到了一种方法,可以让Newtonsoft.Json (Json.Net)与XNA的Rectangle
类很好地协作。首先,您的矩形应该是一个类的属性,这样您就可以给它一个JsonConverter
属性:
public class Sprite
{
[JsonConverter(typeof(MyRectangleConverter))]
public Rectangle Rectangle;
}
public class MyRectangleConverter : JsonConverter
{
public override void WriteJson( JsonWriter writer, object value, JsonSerializer serializer )
{
var rectangle = (Rectangle)value;
var x = rectangle.X;
var y = rectangle.Y;
var width = rectangle.Width;
var height = rectangle.Height;
var o = JObject.FromObject( new { x, y, width, height } );
o.WriteTo( writer );
}
public override object ReadJson( JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer )
{
var o = JObject.Load( reader );
var x = GetTokenValue( o, "x" ) ?? 0;
var y = GetTokenValue( o, "y" ) ?? 0;
var width = GetTokenValue( o, "width" ) ?? 0;
var height = GetTokenValue( o, "height" ) ?? 0;
return new Rectangle( x, y, width, height );
}
public override bool CanConvert( Type objectType )
{
throw new NotImplementedException();
}
private static int? GetTokenValue( JObject o, string tokenName )
{
JToken t;
return o.TryGetValue( tokenName, StringComparison.InvariantCultureIgnoreCase, out t ) ? (int)t : (int?)null;
}
}
它可能需要改进,因此欢迎反馈意见。
Rectangle
的ToString
方法进行转换,而不是提取单个成员值,并且没有方法将其转换回来。我猜测Json.NET使用公共get / set属性(如System.Drawing.Rectangle
)并且无法"看到"Microsoft.Xna.Framework.Rectangle
的公共字段。 - Andrew Russell