Ошибка: ожидание состояния. Не удалось десериализовать объект JSON - PullRequest
0 голосов
/ 23 февраля 2010

Мы пытаемся использовать службу WCF, которая возвращает сведения о сотруднике в формате JSON. как:

{"d":[{"__type":"Employee:#","BigThumbNailURI":null,"ID":1,"Name":"E1"},{"__type":"Employee:#","BigThumbNailURI":null,"ID":2,"Name":"E1"}]}

Из кода VB.net, когда я пытаюсь десериализовать его, говорится, что

"Ожидается состояние 'Элемент' .. Обнаружен 'Текст' с именем '', пространство имен ''."

Фрагмент кода десериализации:

Dim serializer = New DataContractJsonSerializer(GetType(List(Of Employee)))
Dim memoryStream = New MemoryStream()
Dim s = msg.Content.ReadAsString()
serializer.WriteObject(memoryStream, s)
memoryStream.Position = 0

' Code for Deserilization

Dim obj As List(Of Employee) = serializer.ReadObject(memoryStream)
memoryStream.Close()


'Employee Class

<DataContract()> _
Public Class Employee

    Private _Name As String
    <DataMember()> _
    Public Property Name() As String
        Get
            Return _Name
        End Get
        Set(ByVal value As String)
            _Name = value
        End Set
    End Property


    Private _id As Integer
    <DataMember()> _
    Public Property ID() As Integer

        Get
            Return _id
        End Get
        Set(ByVal value As Integer)
            _id = value
        End Set
    End Property


End Class

Кто-нибудь сталкивался с этой проблемой?

Ответы [ 2 ]

2 голосов
/ 24 февраля 2010

Найдено разрешение. Чтобы решить эту проблему, не используйте этот MemoryStream больше. Передайте объект JSON десериализатору напрямую следующим образом:

Dim serializer = New DataContractJsonSerializer(GetType(List(Of Employee))) 

' Code for Deserilization 

Dim obj As List(Of Employee) = serializer.ReadObject(msg.Content.ReadAsString()) 
memoryStream.Close()
0 голосов
/ 22 июня 2010

Вот два общих метода для сериализации и десериализации.

        /// <summary>
        /// Serializes the specified object into json notation.
        /// </summary>
        /// <typeparam name="T">Type of the object to be serialized.</typeparam>
        /// <param name="obj">The object to be serialized.</param>
        /// <returns>The serialized object as a json string.</returns>
        public static string Serialize<T>(T obj)
        {
            Utils.ArgumentValidation.EnsureNotNull(obj, "obj");

            string retVal;
            using (MemoryStream ms = new MemoryStream())
            {
                DataContractJsonSerializer serializer = new DataContractJsonSerializer(obj.GetType());
                serializer.WriteObject(ms, obj);
                retVal = Encoding.UTF8.GetString(ms.ToArray());
            }

            return retVal;
        }

        /// <summary>
        /// Deserializes the specified json string into object of type T.
        /// </summary>
        /// <typeparam name="T">Type of the object to be returned.</typeparam>
        /// <param name="json">The json string of the object.</param>
        /// <returns>The deserialized object from the json string.</returns>
        public static T Deserialize<T>(string json)
        {
            Utils.ArgumentValidation.EnsureNotNull(json, "json");

            T obj = Activator.CreateInstance<T>();
            using (MemoryStream ms = new MemoryStream(Encoding.Unicode.GetBytes(json)))
            {
                DataContractJsonSerializer serializer = new DataContractJsonSerializer(obj.GetType());
                obj = (T)serializer.ReadObject(ms);
            }

            return obj;
        }

Вам понадобятся эти пространства имен

using System;
using System.IO;
using System.Runtime.Serialization.Json;
using System.Text;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...