【问题标题】:error deserializing the object of type .... End element '......' from namespace '' expected. Found element 'item' from namespace ''反序列化类型的对象时出错....应来自命名空间''的结束元素'......'。从命名空间“”中找到元素“项目”
【发布时间】:2013-04-05 19:37:20
【问题描述】:

当我反序列化我的 jsonstring 时,我收到错误消息

 There was an error deserializing the object of type RecordInfo. End element 'Warning' from namespace '' expected. Found element 'item' from namespace ''.

这是我的 JsonString

public const string jsonString = @" 
        {
            ""RequestId"":514106,
            ""Warning"":[],
            ""CustomerData"": {
                ""Email"":""abc@abc.com"",
                ""FullName"":""OrTguOfE"",
                ""OrderData"":[]
            }
        }";

数据合约

[DataContract]
    public class RecordInfo
    {
        [DataMember(Name = "RequestId")]
        public string RequestId { get; set; }

        [DataMember(Name = "Warning")]
        public string Warning { get; set; }

        [DataMember(Name = "CustomerData")]
        public CustomerData CustomerData { get; set; }
    }
 [DataContract]
    public class CustomerData
    {
        [DataMember(Name = "Email")]
        public string RequestId { get; set; }

        [DataMember(Name = "FullName")]
        public string FullName  { get; set; }

        [DataMember(Name = "OrderData")]
        public OrderData[]  OrderData { get; set; }
    }
[DataContract]
    public class OrderData
    {
        [DataMember(Name = "OrderId")]
        public string OrderId { get; set; }

        [DataMember(Name = "SourceId")]
        public string SourceId { get; set; }

        [DataMember(Name = "SourceData")]
        public SourceData[] SourceData { get; set; }
    }

    [DataContract]
    public class SourceData
    {
        [DataMember(Name = "SourceDescription")]
        public string SourceDescription { get; set; }

        [DataMember(Name = "ProductName")]
        public string ProductName { get; set; }
    }
}

这是我使用的反序列化器

private static T Deserialize<T>(string jsonString)
    {
        using (var ms = new MemoryStream(Encoding.Unicode.GetBytes(jsonString)))
        {
            var serializer = new DataContractJsonSerializer(typeof(T));
            return (T)serializer.ReadObject(ms);
        }
    }

当我反序列化 bove jsonstring 时,我收到错误消息

 There was an error deserializing the object of type RecordInfo. End element 'Warning' from namespace '' expected. Found element 'item' from namespace ''.

有解决此错误的建议吗?

【问题讨论】:

  • 你想成为哪个DataMember(s)Nullable
  • @Wiemon 假设映射到什么“警告”?

标签: c# json datacontractjsonserializer


【解决方案1】:

设置IsRequired = false,例如:

[DataMember(Name = "RequestId", IsRequired = false)]

MSDN 来源DataMemberAttribute.IsRequired Property

获取或设置一个值,该值指示序列化引擎 读取或反序列化时成员必须在场。

【讨论】:

  • 对于我的代码,我在反序列化过程中收到一条错误消息 反序列化 RecordInfo 类型的对象时出错。应来自命名空间“”的结束元素“警告”。从命名空间“”中找到元素“项目”。
  • 您的问题出在其他地方:您已将 Warning 属性声明为 string,但您的 JSON 包含一个对象:""Warning"":[]
  • 如果有“警告”:[“WARNING_no data ForCustomer”] 如果我创建像 [DataContract(Name = "Warning")] 这样的数据合同,我的警告对象应该是什么样子 public class Warning { [DataMember(Name = "Message", IsRequired = false)] public string Message { get;放; } } ,它不会返回消息
  • 将您的 Warning 属性定义更改为 string[]: public string[] Warning { get; set; }
  • 对于我的代码,我收到以下错误{“反序列化 System.String 类型的对象时出错。应从命名空间''结束元素'root'。从命名空间'找到元素'菜单' '."} 我应该怎么做才能解决它
【解决方案2】:

我发现类似错误的另一个原因是当我们将 Json 字段的数组类型映射到数据协定类的非数组字段时。 (例如)我的 JSON 数据就像 -

"ipAddress": [
    "10.61.255.25",
    "fe80:0000:0000:0000:10e1:0b66:96a6:9ac8"
]

但是因为我不知道这种类型的IPAddress 数据,所以我将ipaddress 映射到

[DataMember(Name="ipAddress")]
public string IPAddress ( get; set; }

应该是

[DataMember(Name="ipAddress")]
public string[] IPAddress ( get; set; }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多