【问题标题】:Error: Expecting state. Could not Deserialize JSON Object错误:预期状态。无法反序列化 JSON 对象
【发布时间】:2011-01-20 02:23:31
【问题描述】:

我们正在尝试使用以 JSON 格式返回员工详细信息的 WCF 服务。 喜欢:

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

当我试图反序列化它时,从后面的 VB.net 代码中可以看出

“期待状态'元素'..遇到名称'',命名空间''的'文本'。”

反序列化代码sn-p:

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

有人遇到过这个问题吗?

【问题讨论】:

    标签: asp.net vb.net wcf json serialization


    【解决方案1】:

    找到解决方案。要解决此问题,请不要再使用该 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()
    

    【讨论】:

      【解决方案2】:

      这里有两种通用的序列化和反序列化方法。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-12-30
        • 2014-08-04
        • 1970-01-01
        相关资源
        最近更新 更多