Десериализация Guids с использованием Json.Net для ExpandoObject теряет тип и является строкой
Учитывая следующий класс:
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 ответ
ExpandoObject не может знать, что вы хотите, чтобы это поле было типом Guid, поэтому тип свойства, вероятно, является строкой. Чтобы подтвердить, запустите этот тест:
Debug.Assert(reconstitudedEntity.UniqueId is String);