Mass Transit无法使用一个元素反序列化集合

时间:2014-04-21 17:18:49

标签: c# json.net masstransit

我有这样的Mass Transit消息界面:

public interface IPerson
{
    ICollection<PersonalName> Names { get; }
}

public class PersonalName
{
    public string FamilyName { get; set; }
    public string GivenName { get; set; }
    public string SecondName { get; set; }
    public string Use { get; set; }
}

这适用于使用JsonMessageSerializer序列化和反序列化邮件。我也可以使用XmlMessageSerializer序列化消息,结果看起来有点像这样:

<person>
    <names>
        <familyName>Simpson</familyName>
        <givenName>Homer</givenName>
        <secondName>Jay</secondName>
        <use>Official</use>
    </names>
    <names>
        <givenName>Homie</givenName>
        <use>Nickname</use>
    </names>
</person>

如果集合为空或者它有多个元素,我可以反序列化它。但是,如果集合包含正好一个元素,那么当我去反序列化时,我会收到此错误:

  

无法将当前JSON对象(例如{"name":"value"})反序列化为类型&#39; System.Collections.Generic.ICollection`1[MyNs.PersonalName]&#39;因为该类型需要JSON数组(例如[1,2,3])才能正确反序列化。

     

要修复此错误,请将JSON更改为JSON数组(例如[1,2,3])或更改反序列化类型,使其成为普通的.NET类型(例如,不是像整数这样的基本类型,而不是集合类型像数组或List<T>),可以从JSON对象反序列化。 JsonObjectAttribute也可以添加到类型中以强制它从JSON对象反序列化。

     

路径&#39; person.names.familyName&#39;。

我可以通过使用数组或List<T>来解决这个问题,但我真的很想避免这样做。有没有办法让Mass Transit的XmlMessageSerializer反序列化ICollection<T>类型?由于Mass Transit使用Json.NET进行序列化(即使是XML),我希望有一些方法可以注释该类型,以便它可以接受ICollection<T>

1 个答案:

答案 0 :(得分:0)

而不是尝试反序列化:

{"FamilyName":"Smith","GivenName":"John"}

你必须传入一个数组来反序列化:

[{"FamilyName":"Smith","GivenName":"John"}]