【问题标题】:DataContractJsonSerializer exceptionDataContractJsonSerializer 异常
【发布时间】:2013-07-11 13:43:38
【问题描述】:

我在使用我的课程时遇到此错误。

错误

来自命名空间“”的预期元素“根”..遇到“无”与 名称'',命名空间

我的班级

[DataContract]
public class EntryData
{
    [DataMember]
    public string EntryId { get; set; }

    [DataMember]
    public string EmailAddress { get; set; }

    [DataMember]
    public string StatusCode { get; set; }

    [DataMember]
    public string TotalVoteCount { get; set; }

    public static T Deserialise<T>(string json)
    {
        var obj = Activator.CreateInstance<T>();
        using (var memoryStream = new MemoryStream(Encoding.Unicode.GetBytes(json)))
        {
            memoryStream.Position = 0;
            var serializer = new DataContractJsonSerializer(obj.GetType());
            obj = (T)serializer.ReadObject(memoryStream); // getting exception here                    
            return obj;
        }
    }
}

用法

string responseJson = new StreamReader(HttpContext.Current.Request.InputStream).ReadToEnd();
var results = EntryData.Deserialise<EntryData>(response)

我在网上看到它与memoryStream position有关,但正如您所见,我将其设置为开头。

请帮忙。

Json 去处理程序

我在传入 JSON 时没有设置 StatusCode 或 TotalVoteCount。不过我认为这不是问题。

{
    "EntryId":"43",
    "EmailAddress":"test@email.com"
}

回答

我现在使用这个,而不是在我的类中使用 Deserialize 方法。

//commented out this code.        
string responseJson = new StreamReader(HttpContext.Current.Request.InputStream).ReadToEnd();
var results = EntryData.Deserialise<EntryData>(response)

// this is the way to go using JavaScriptSerializer   
var serializer = new JavaScriptSerializer();
var results = serializer.Deserialize<EntryData>(response);

【问题讨论】:

  • 你能发布你的 JSON 吗?我认为这可能是由于您的 JSON 名称与您的 C# 类和属性名称不匹配造成的。这将导致序列化程序不知道如何在两者之间进行转换。
  • 请查看我的 json 请求
  • 谢谢,嗯...那我没主意了。我同意你的观点,离开这些字段不应该导致问题。默认情况下,DataMember 的 IsRequired 属性为 false,所以我认为应该没问题。

标签: c# json jquery exception-handling ashx


【解决方案1】:

这可能是由于您的 JSON 名称与 C# 中的属性名称不匹配造成的吗?

我的理解是这样的

{
     "FirstName" : "Mark"
}

可以反序列化为:

[DataContract]
public class Person 
{    
     [DataMember]
     public string FirstName {get; set;}
}

但这将无法序列化

{
     "Name" : "Mark"
}

除非您将 C# 类更改为 DataMember 的显式名称

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

我不确定这会导致哪个错误。我没有足够的第一手经验。

【讨论】:

  • 请查看我的 json 请求
【解决方案2】:

您认为这可能是编码问题吗?您是否尝试过使用 Encoding.UTF8 而不是 Unicode?​​p>

我看到的所有使用 DataContractSerializer 的示例都使用了 UTF-8 编码。

Encoding.Unicode 是 UTF-16 编码。

我找不到任何明确说明 DataContractSerializer 支持哪些编码的文档。我认为它足够聪明,可以检测到正确的编码,但我对编码知之甚少。在这种情况下,这可能是不可能的。

【讨论】:

  • 我认为这不是编码问题。反正找到了解决办法..请看我的回答
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-08-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-24
  • 2023-03-21
  • 1970-01-01
相关资源
最近更新 更多