我有两条消息:
string test1 = @"{ ""coords"": { x: 1, y: 2, z: 3 }, ""w"": 4, ""success"": true}";
string test2 = @"{ ""coords"": { x: 1, y: 2, z: 3 }, ""success"": true}";
鉴于我要反序列化的以下类:
public struct Coordinate
{
public int x { get; set; }
public int y { get; set; }
public int z { get; set; }
public int w { get; set; }
}
public class MessageBody
{
[JsonConverter(typeof(JsonCoordinateConverter))]
public Coordinate Coords;
public bool Success { get; set; }
}}
是否可以编写JsonCoordinateConverter
以便能够读取w
对象上下文之外的coords
属性?
我尝试了以下内容:
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
Coordinate coords = new Coordinate();
JObject coordObject = JObject.Load(reader);
// move to the next token
reader.Read();
if (reader.Path == "w")
{
coords.w = reader.ReadAsInt32().Value;
}
else
{
// for test2, the token here is success,
// how do I rewind for the regular deserializer to read it?
reader.Skip();
}
coords.x = coordObject["x"].Value<int>();
coords.y = coordObject["y"].Value<int>();
coords.z = coordObject["z"].Value<int>();
return coords;
}
但是,通过这种方法,如果success
不在原始邮件中,我正在阅读w
属性,并且常规反序列化程序不会获取success
值。因此,我需要以某种方式查看w
是否存在,或者在我找不到它时倒带,但无法找到办法。
注意:这是一个非常简化的问题表示,真实的消息和对象更大,而常规的反序列化器对它们工作正常,所以我想避免编写自定义代码所有内容,如果可能的话,只保留coords
+ w
。
工作demo code gist,第二断言当然失败了。