4

使用我的课程时出现此错误。

错误

期望来自命名空间“”的元素“根”。遇到名称为“”的“无”,命名空间

我的课

[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 positionBUT 有关,你可以看到我将它设置为开头。

请帮忙。

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);
4

2 回答 2

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

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

于 2013-07-11T14:12:43.583 回答
0

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

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

Encoding.Unicode是一种 UTF-16 编码。

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

于 2013-07-11T15:13:32.860 回答