2013-07-11 48 views
4

我在使用我的課程時遇到此錯誤。DataContractJsonSerializer異常

錯誤

期待元件從命名空間 '根' '' ..遇到 '無' 與 名 '',命名空間

我類

[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":"[email protected]" 
} 

ANSWER

而不是使用在我的類反序列化方法我現在這正在使用的。

//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

你可以發佈你的JSON嗎?我認爲這可能是由於您的JSON名稱與您的C#類和屬性名稱不匹配造成的。這會導致序列化程序不知道如何在兩者之間進行轉換。 –

+0

看到我的json請求有問題,請 –

+0

謝謝,嗯......我當時沒有想法。我同意你離開這些領域不應該導致問題。默認情況下,DataMember的IsRequired屬性爲false,所以我認爲它應該沒問題。 –

回答

3

難道這是由您的JSON名稱與您在C#中的屬性名稱不匹配造成的嗎?

我的理解是,

{ 
    "FirstName" : "Mark" 
} 

將能夠反序列化到:

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

但除非你改變了你的C#這不會是能夠序列化

{ 
    "Name" : "Mark" 
} 

類具有DataMember的顯式名稱

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

我不確定這會導致哪個錯誤。我沒有足夠的第一手經驗。

+0

請參閱我的json請求的問題請 –

0

你認爲這可能是一個編碼問題?您是否嘗試過使用Encoding.UTF8而不是Unicode?

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

Encoding.Unicode是UTF-16編碼。

我找不到任何明確指出哪些編碼DataContractSerializer支持的文檔。我認爲它足夠聰明,能夠檢測到正確的編碼,但我不知道有關編碼的全部內容。也許在這種情況下這是不可能的。

+0

我不認爲這是一個編碼問題。無論如何找到了解決方案..請參閱我的答案 –