2013-07-11 3 views
4

Я получаю эту ошибку при использовании моего класса.Исключение DataContractJsonSerializer

Ошибка

Ожидать элемент 'корень' из пространства имен '' .. не Встречающиеся 'None' с названием '', пространство имен

Мой класс

[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 при прохождении JSON. Я не думаю, что это проблема, хотя.

{ 
    "EntryId":"43", 
    "EmailAddress":"[email protected]" 
} 

ОТВЕТ

Вместо того, чтобы использовать метод десериализации в моем классе я использую теперь это.

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

Спасибо, хммм ... Тогда у меня нет идей. Я согласен с вами в том, что отказ от этих полей не должен вызывать проблемы. По умолчанию свойство IsRequired DataMember является ложным, поэтому я думаю, что все должно быть хорошо. –

ответ

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

Я не уверен, какую ошибку это могло бы вызвать. У меня недостаточно опыта из первых рук.

+0

см. Мой запрос json в вопросе пожалуйста –

0

Считаете ли вы, что это может быть проблема с кодировкой? Вы пытались использовать Encoding.UTF8 вместо Unicode?

Все примеры, которые я видел с помощью DataContractSerializer, использовали кодировку UTF-8.

Encoding.Unicode - кодировка UTF-16.

Я не могу найти какую-либо документацию, в которой явным образом указываю, какие кодировки DataContractSerializer поддерживает. Я предполагаю, что это было бы достаточно разумно, чтобы обнаружить правильную кодировку, но я не очень хорошо знаю кодировки. Возможно, в этом случае это действительно невозможно.

+0

Я не думаю, что это проблема кодирования. в любом случае нашли решение .. см. мой ответ –