Десериализация Guids с использованием Json.Net для ExpandoObject теряет тип и является строкой - PullRequest
2 голосов
/ 17 января 2012

Дан следующий класс:

public class Entity
{
    public Guid UniqueId
    {
        get;
        set;
    }
}

Следующий тест не пройден:

    [Test]
    public void GuidTest()
    {
        var entity = new Entity { UniqueId = Guid.NewGuid() };
        var entityJson = JsonConvert.SerializeObject(entity);
        dynamic reconstitutedEntity = JsonConvert.DeserializeObject<ExpandoObject>(entityJson);
        Assert.That(reconstitutedEntity.UniqueId, Is.EqualTo(entity.UniqueId));
    }

С ошибкой:

Ожидается: 35ac3081-07cb-41dd-bf40-22e2ff47863c Но было: "35ac3081-07cb-41dd-bf40-22e2ff47863c"

Это ошибка в Json.Net или ожидаемое поведение? Как мне пройти тест, используя ExpandoObject?

Если я заменю ExpandoObject на Entity, он будет работать нормально. Должен ли я написать собственный JsonConverter? Я пытался это сделать, но по какой-то причине ReadJson никогда не вызывался, хотя CanConvert и WriteJson были (успешно).

1 Ответ

1 голос
/ 27 января 2012

ExpandoObject не может знать, что вы хотите, чтобы это поле было типом Guid, поэтому тип свойства, вероятно, является строкой.Для подтверждения запустите этот тест:

Debug.Assert(reconstitudedEntity.UniqueId is String);
...