从匿名类型返回Json

时间:2014-01-08 10:55:44

标签: c# json wcf rest anonymous-types

我正在尝试从WCF服务返回JSONified匿名类型。

我成功地这样做了,但我正在寻找更好的选择..

// In IService
[OperationContract]
[FaultContract(typeof(ProcessExecutionFault))]
[Description("Return All Room Types")]
[WebInvoke(UriTemplate = "/GetAllRoomTypes", Method = "GET", RequestFormat = WebMessageFormat.Json,
ResponseFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.Bare)]
Stream GetAllRoomTypes();

// In Service Implementation

[LogBeforeAfter]
Stream GetAllRoomTypes()
{
   try
   {
       var allRoomTypes = Helper.GetAllRoomTypes();
       var stream = new MemoryStream();
       var writer = new StreamWriter(stream);
       writer.Write(allRoomTypes);
       writer.Flush();
       stream.Position = 0;
       return stream;
    }
    catch (Exception ex)
    {
       TableLogger.InsertExceptionMessage(ex);
       return null;
    }
}

// In Business Logic:

public string GetAllRoomTypes(){
    try
    {
       return CustomRetryPolicy.GetRetryPolicy().ExecuteAction(() =>
         {
          using (var context = new DatabaseEntity())
          {
             var retResult = from v in context.RoomMasters select new { Id = v.RoomTypeID, Type = v.RoomType };
             var retResult1 = retResult.ToJson();
             return retResult1;
           }
          }
         );
      }
      catch (Exception ex)
      {
        Trace.Write(String.Format("Exception Occured, Message: {0}, Stack Trace :{1} ", ex.Message, ex.StackTrace));
        return null;
      }
 }

我的问题是,有更好的方法吗?

2 个答案:

答案 0 :(得分:0)

尝试使用JavaScriptSerializer

using (var context = new DatabaseEntity())
{
    var retResult = from v in context.RoomMasters select new { Id = v.RoomTypeID, Type = v.RoomType };
    JavaScriptSerializer serializer = new JavaScriptSerializer();
    var output = serializer.Serialize(retResult);    
    return output;
}

答案 1 :(得分:0)

使用类作为数据协定而不是直接返回json。然后,在您的方法中,只返回数据协定类的列表或数组。 WCF将负责将其序列化为配置的格式(JSON或XML)。

[DataContract]
public class RommDto{
    [DataMember]
    public int Id {get; set;}
    [DataMember]
    public RoomType Type {get; set;}
}

.....

[LogBeforeAfter]
RoomDto[] GetAllRoomTypes()
{
....
}