Peek JsonReader读取JsonConverter自己的对象

时间:2017-04-07 20:46:27

标签: c# json.net

我有两条消息:

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,第二断言当然失败了。

0 个答案:

没有答案