DataContractJsonSerializer异常

时间:2013-07-11 13:43:39

标签: c# json jquery exception-handling ashx

我在上课时遇到这个错误。

错误

  

期望来自命名空间''的元素'root'。遇到'无'   name'',namespace

我的班级

[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;
        }
    }
}

USAGE

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"
}

ANSWER

我现在正在使用,而不是在我的课程中使用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);

2 个答案:

答案 0 :(得分:3)

是否可能是因为您的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;}
}

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

答案 1 :(得分:0)

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

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

Encoding.Unicode是UTF-16编码。

我找不到任何明确说明DataContractSerializer支持哪种编码的文档。我认为它足够智能来检测正确的编码,但我不知道关于编码的全部内容。在这种情况下,这可能不太可能。