2010-11-16 14 views
2

我使用JSON來建立一個網站時,返回結果的配發JSON的方法,但發現自己寫一大把的這樣的代碼:得到返回在C#和asp.net MVC 2或3

return Json((
        from s in searchResults 
        select new { 
         orderID = s.OrderID, 
         OrderRealID = s.OrderRealID, 
         OrderStatus = s.OrderStatus, 
         OrderDate = s.OrderDate, 
         OrderVenue = s.VenueName + " - " + s.VenueLocation + " (" + s.VenueNumber + ")", 
         OrderStatusText = s.StatusOrderValue 
        } 
       ), JsonRequestBehavior.DenyGet); 

我想這樣做是這樣的:

public string ResultsToJson<T>(hashtable fields){ 
        from s in T 
        select new { 
         // loop through hash table 
        } } 

,然後簡單地調用與任何IEnumerable的結果我有 我的問題是,我將在這裏行權,這將是最好的方式這個功能到 這樣做,因爲它是沒有意義的寫在MVC和OOP,但不斷重寫代碼只是從? IN? 一直。

非常感謝

回答

1

什麼類型的你的散列表(Dictionary<T,T>自2.0)成立?如果這是一個普通的Dictionary<string,string>那麼你可以自己寫JSON。

如果它有一組內部具有更多類型的類型,一直到葉節點,那麼它將值得看看JSON.NET庫,因爲它具有比標準.NET更高級的JSON功能JSON序列化程序。

+0

我的散列表將有一個鍵(字段i將使用)和值(Property in T)想到創建一個字符串並返回字符串,然後運行返回Json(System.Web.Script.Serialization.JavaScriptSerializer(reultsfromcode),JsonRequestBehavior.DenyGet); – davethecoder 2010-11-16 11:37:52

+0

因此,鍵將是一個字符串,並且值可以是任何類型? – 2010-11-16 11:53:12

+0

是的,這是正確的,但多數民衆贊成的問題不知道什麼是最好的方法是嘗試和建立這樣,我可以說循環通過「集合」,並獲得結果,而不依賴於屬性和類型 – davethecoder 2010-11-16 12:00:30

0

您可以使用Reflection遍歷所有屬性。但使用緩存,因爲它是痛苦的緩慢。

+0

是的,我想我需要反思看我意識到我wouldent能夠使用散列表,然後與反射工作,以獲得 davethecoder 2010-11-16 11:36:03

+0

使用反射你可以做ConvertToJSON(對象o)。那麼不需要使用強類型。也可以獲取屬性名稱或創建自定義屬性,使其全部按預期進行轉換(例如[JsonName(「Something」)] – Migol 2010-11-16 11:57:18

0

這裏是我的測試中的一個片段(教育)項目:

public class OneTwoThree 
{ 
    public string One { get; set; } 
    public string Two { get; set; } 
    public string Three { get; set; } 
} 

/// <summary> 
/// Should serialize the anonymous object 
/// and deserialize it into a strong type. 
/// </summary> 
/// <remarks> 
///  An MVC JSON result on the server can use anonymous objects that are serialized 
///  into strong types on a rich client. 
/// 
///  「Making use of your JSON data in Silverlight」 
///  [http://timheuer.com/blog/archive/2008/05/06/use-json-data-in-silverlight.aspx] 
/// 
///  「ASP.NET MVC: Using dynamic type to test controller actions returning JsonResult」 
///  [http://weblogs.asp.net/gunnarpeipman/archive/2010/07/24/asp-net-mvc-using-dynamic-type-to-test-controller-actions-returning-jsonresult.aspx] 
/// 
///  「ASP.NET MVC – Unit Testing JsonResult Returning Anonymous Types」 
///  [http://www.heartysoft.com/post/2010/05/25/ASPNET-MVC-Unit-Testing-JsonResult-Returning-Anonymous-Types.aspx] 
/// 
///  「.NET 3.5: JSON Serialization using the DataContractJsonSerializer」 
///  [http://pietschsoft.com/post/2008/02/NET-35-JSON-Serialization-using-the-DataContractJsonSerializer.aspx] 
/// </remarks> 
[TestMethod] 
public void ShouldSerializeAnonymousObject() 
{ 
    var data = new 
    { 
     One = "uno", 
     Two = "dos", 
     Three = "tres" 
    }; 

    var result = new JsonResult 
    { 
     Data = data, 
     ContentEncoding = Encoding.Unicode 
    }; 

    var serializer = new JavaScriptSerializer(); 

    var actual = serializer.Serialize(result.Data); 
    var expected = @"{""One"":""uno"",""Two"":""dos"",""Three"":""tres""}"; 
    Assert.AreEqual(expected, actual); 

    var clientSerializer = new DataContractJsonSerializer(typeof(OneTwoThree)); 

    using(var stream = new MemoryStream(Encoding.Unicode.GetBytes(actual))) 
    { 
     var clientObject = clientSerializer.ReadObject(stream) as OneTwoThree; 
     Assert.IsNotNull(clientObject); 
    } 
} 

/// <summary> 
/// Should serialize the generic dictionary 
/// and deserialize it. 
/// </summary> 
[TestMethod] 
public void ShouldSerializeGenericDictionary() 
{ 
    var dictionary = new Dictionary<string, string>(); 
    dictionary.Add("One", "uno"); 
    dictionary.Add("Two", "dos"); 
    dictionary.Add("Three", "tres"); 

    var result = new JsonResult 
    { 
     Data = dictionary, 
     ContentEncoding = Encoding.Unicode 
    }; 

    var serializer = new JavaScriptSerializer(); 

    var actual = serializer.Serialize(result.Data); 
    var expected = @"{""One"":""uno"",""Two"":""dos"",""Three"":""tres""}"; 
    Assert.AreEqual(expected, actual); 

    var clientSerializer = new DataContractJsonSerializer(typeof(Dictionary<string, string>)); 

    using(var stream = new MemoryStream(Encoding.Unicode.GetBytes(actual))) 
    { 
     var clientObject = clientSerializer.ReadObject(stream) as Dictionary<string, string>; 
     Assert.IsNotNull(clientObject); 
    } 
} 
-1

我很好奇,爲什麼不這樣做呢?

return Json(searchResults, JsonRequestBehavior.DenyGet); 

在引擎蓋下使用JavaScriptSerializer,它處理相當大範圍的類型。只要你沒有任何循環引用,一個簡單的扁平對象集合(對你的例子而言)不應該是內置序列化程序的問題。

+0

,因爲它是亞音速類和返回和錯誤在序列化'XXX'類型的對象時,檢測到循環引用看到我對此前感謝 – davethecoder 2010-11-17 10:47:27

+0

我的上述意見這不是在你的問題。您應該更新它以指定,對於將來閱讀此內容的人員。如果集合可以使用Json()幫助程序進行序列化,那麼不希望發送它們增加更多的複雜性。 – 2010-11-18 17:01:58