Сериализация Json для Windows Phone - PullRequest
1 голос
/ 03 июля 2011

Я пытался реализовать синтаксический анализ ответа JSON, как показано здесь для моего проекта Windows Phone 7 в C #.Но я застрял с ошибкой компиляции: «Не удалось найти тип или имя пространства имен« Сериализуемый »(отсутствует директива using или ссылка на сборку?)»

У меня есть импорт с использованием System.Runtime.Serialization;using System.Runtime.Serialization.Json;Я не уверен, какой импорт мне не хватает.Я пытался включить с помощью System.ServiceModel.Web;Но веб-часть не распознается.

Я думал, что мой проект не указывает на правильную структуру из здесь .Но в информации о сборке я не могу изменить целевую платформу.

Эта похожа на мою проблему, но я не смог найти JSON.NET в.net dll, отфильтрованный для Windows Phone.

Может кто-нибудь помочь мне заставить эту штуку JSON работать на Windows Phone 7.

Заранее спасибо.

РЕДАКТИРОВАТЬ - 7/3/11

Мой ответ Джейсона: {"serviceresponse": {"servicename": "RequestRegisterUser", .....

И мои объекты Response:

[DataContract]
       public class serviceresponse
       {
             [DataMember]
           public String servicename { get; set; }
           .
           .
           .

И мой метод десериализации:

 public static T Deserialise<T>(string json)
   {
       T obj = Activator.CreateInstance<T>();
       using (MemoryStream stream = new MemoryStream(Encoding.Unicode.GetBytes(json)))
       {
           DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(T));
           obj = (T)serializer.ReadObject(stream);
           return obj;
       }
   }

Теперь я получаю эту ошибку после десериализации ответа: servicename Не удалось вычислить строку выражения

(я могне импортировать System.ServiceModel.Web, хотя у меня есть dll в ссылке. Ошибка компиляции в части .Web (имя типа или пространства имен 'Web' не существует в пространстве имен 'System.ServiceModel'))

РЕДАКТИРОВАТЬ После дополнительных исследований я нашел свой реsponse при просмотре в отладчике на самом деле {\ "serviceresponse \": {\ "servicename \": \ "RequestRegisterUser \", ..... Я искал это и обнаружил, что это может быть проблемой.Как я могу отформатировать его, чтобы исправить JSON String ??

Ответы [ 3 ]

3 голосов
/ 03 июля 2011

Необходимо добавить ссылку на сборки System.Runtime.Serialization и System.ServiceModel.Web. DataContractJsonSerializer определяется в сборке System.ServiceModel.Web в версии платформы Silverlight, поэтому вам нужна дополнительная ссылка на сборку.

И, кстати, JSON.NET - это популярный JSON-фреймворк с открытым исходным кодом для .Net, и вы можете узнать больше об этом здесь . Он не является частью .Net Framework, поэтому вы не можете его найти.

Редактировать:

  1. Что касается компиляции, в Silverlight DataContractJsonSerializer находится в пространстве имен System.Runtime.Serialization.Json, но в сборке System.ServiceModel.Web (в System.ServiceModel.Web.dll), что немного сбивает с толку. Таким образом, вы используете это так - System.Runtime.Serialization.Json.DataContractJsonSerializer, но нужна дополнительная ссылка на сборку. Вам также необходимо сослаться на сборку System.Runtime.Serialization, поскольку именно здесь определен атрибут DataContract. Я вижу, вы уже успешно скомпилировали код, но я надеюсь, что дополнительное объяснение сделает его более понятным для будущих читателей.
  2. О самой сериализации - как вы уже узнали, вам понадобятся два объекта, просто потому, что это структура json. Однако атрибуты DataContract и DataMember имеют свойство Name, которое можно использовать вместо изменения имени полей. Кроме того, вы можете использовать свойства вместо полей, если хотите.

Например:

[DataContract]
public class ServiceResponse
{
    [DataMember(Name = "servicename")]
    public string ServiceName { get; set; }
}

[DataContract]
class Response
{
    [DataMember(Name = "serviceresponse")]
    public ServiceResponse ServiceResponse { get; set; }
}

И последнее: вам не нужен вызов Activator.CreateInstance (); в вашем Deserialise методе.

1 голос
/ 03 июля 2011

Это, безусловно, поможет, если вы разместите свой код. Так что я могу только догадываться:

Я полагаю, у вас есть что-то вроде этого:

[Serializable]
public class Response
{
    [DataMember]
    public string name { get; set; }
    ...
}

Но это смесь двух концепций сериализации, одна из которых не поддерживается в Phone 7. Правильные атрибуты: DataContract и DataMember :

[DataContract]
public class Response
{
    [DataMember]
    public string name { get; set; }
    ...
}
0 голосов
/ 04 июля 2011

Я нашел проблему. Хотя мое имя класса «serviceresponse», я использовал другой класс-оболочку как

public class Response
{
   public serviceresponse serviceres;//Don't Do this....
}

где я использовал имя переменной для serviceresponse в качестве serviceres. Но когда я изменил его на «serviceresponse», все заработало.

public class Response
{
   public serviceresponse serviceresponse;//This fixed it.
}
...