【问题标题】:how to Deserialize Json response from WCF Restful Service?如何反序列化来自 WCF Restful 服务的 Json 响应?
【发布时间】:2015-02-13 08:00:07
【问题描述】:

我想将 Json 响应反序列化到我的类对象中。我创建了一个 WCF Restful 服务,并从使用代理对象的客户端调用了一个返回 json 的服务方法。现在我想将该 json 转换为我的类对象。 我的服务如下:

[OperationContract]
    [WebInvoke(Method = "GET",
        ResponseFormat = WebMessageFormat.Json,
        BodyStyle = WebMessageBodyStyle.Wrapped,
        UriTemplate = "GetProject/{projectID}")]
    tblProject GetProject(String projectID);

实现:

public tblProject GetProject(String projectID)
        {
            tblProject pro = new tblProject();
            pro = DAL.ProjectDAL.GetProject(Convert.ToInt32(projectID));
            return pro;
        }

我从 MVC 中的控制器发出请求:

public ActionResult Index()
        {
            var request = (HttpWebRequest)WebRequest.Create("http://localhost:8733/Design_Time_Addresses/RestServiceLibrary.RESTService/REST_ProjectService/getproject/2");
            HttpWebResponse response = request.GetResponse() as HttpWebResponse;
            Stream stream = response.GetResponseStream();
            StreamReader reader = new StreamReader(stream);
                string txtResult = reader.ReadToEnd();
return view();
    }

当我运行时,我得到的响应是:

当我通过代理方法调用时出现异常:

但我的端点在配置中,

【问题讨论】:

  • 您没有使用 WCF 代理客户端,而是在进行 http 请求调用。你为什么不使用它应该为你处理反序列化的 WCF 代理?
  • @Enes 我更新了我的问题,请查看它。
  • REST 服务不使用代理 - 这是 SOAP Web 服务的一个特性。
  • @Tim 所以我只能使用 WebRequest?
  • @NomiAli - 据我所知,它适用于 RESTful 服务,是的,或者其他一些面向 HTTP 的方法(如 HttpClient)。

标签: json wcf asp.net-mvc-4 rest


【解决方案1】:
class GetProjectResultWrapper
    {
        public GetProjectResult GetProjectResult{ get; set; }
    }
    class GetProjectResult 
    {
        public string id {get;set;}
        .....
        ......
    }
JavaScriptSerializer ser = new JavaScriptSerializer();
    GetProjectResultWrapper response = ser.Deserialize<GetProjectResultWrapper>(sb.ToString());
response .GetProjectResult;

【讨论】:

  • 我在 GETProjectResultClass 的所有属性中都为 null,因为它没有反序列化! @sakir
  • 您是否正确创建了 GetProjectResultClass?
  • 我实际上是在客户端使用 DataContract 类对象。 @sakir 我没有使用服务数据合同类在模型中创建相同的类。
【解决方案2】:

你可以使用javascriptserializer

string s = "YouJsonText";
var serializer = new JavaScriptSerializer();
var result = serializer.Deserialize(s);
//or
YouCustomClass res = serializer.Deserialize<YouCustomClass>(sb.ToString());

另外,您可以像这样使用 CustomJsonConverter:

public class YouCustomClassConverter : JavaScriptConverter
{
  public override object Deserialize(IDictionary<string, object> dictionary, Type type,                      JavaScriptSerializer serializer)
  {
      throw new NotImplementedException();
  }

  public override IDictionary<string, object> Serialize(object obj, JavaScriptSerializer serializer)
  {
      throw new NotImplementedException();
  }

   //and first you need register type, which you want Deserialize
   public override IEnumerable<Type> SupportedTypes
   {
      get { return new[] { typeof(YouCustomClass ) }; }
   }

}

//and then example of using JavaScriptSerializer with custom converter
var ser = new JavaScriptSerializer();
ser.RegisterConverters(new JavaScriptConverter[] { new YouCustomClassConverter() });
try
{
     YouCustomClass obj = ser.Deserialize(jsonString);
}

注意:你需要使用using System.Web.Script.Serialization;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-10
    • 1970-01-01
    • 1970-01-01
    • 2019-01-04
    • 1970-01-01
    • 2011-09-14
    相关资源
    最近更新 更多