我在上课时遇到这个错误。
期望来自命名空间''的元素'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;
}
}
}
string responseJson = new StreamReader(HttpContext.Current.Request.InputStream).ReadToEnd();
var results = EntryData.Deserialise<EntryData>(response)
我在网上看到它与memoryStream position
有关,但你可以看到我将它设置为开头。
请帮忙。
在传入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);
答案 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? p>
我使用DataContractSerializer看到的所有示例都使用了UTF-8编码。
Encoding.Unicode是UTF-16编码。
我找不到任何明确说明DataContractSerializer支持哪种编码的文档。我认为它足够智能来检测正确的编码,但我不知道关于编码的全部内容。在这种情况下,这可能不太可能。