2012-09-27 103 views
2

我已經存儲了與RavenDB一個模型,這樣做的話:的Json領域爲了

public abstract class Animal 
{ 
    public string Id { get; set; } 
    public int LegsNumber { get; set; } 
} 

public class Giraffe: Animal 
{ 
    public double NeckLength { get; set; } 
} 

在我的MVC控制器我查詢所有的長頸鹿,並把結果以JSON格式是這樣的:

return new JsonResult 
{ 
    JsonRequestBehavior = System.Web.Mvc.JsonRequestBehavior.AllowGet, 
    Data = DocumentSession.Query<Giraffe>() 
}; 

輸出是一樣的東西

[{"NeckLength":2.5, "Id":"bob", "LegsNumber":4}, {...}, ...] 

我如何可以定製,以便在現場以有這樣的結果:

[{"Id":"bob", "LegsNumber":4, "NeckLength":2.5}, {...}, ...] 

如果你好奇,你想知道爲什麼我想改變的順序是因爲我有一搭JSON,並打印出來,因爲它是一個通用的JavaScript代碼段:

for (var field in data[0]) { 
    var row = '<tr>'; 
    row += '<td><b>' + field + '</b></td>' 

    $.each(data, function (i, value) { 
     row += '<td>' + value[field] + '</td>' 
    }); 

    row += '</tr>'; 
    result += row; 
} 
+1

爲什麼你想這樣..順序並不在JSON –

+0

重要,因爲: - 我需要按特定順序打印出數據 - 我不想添加訂單字段 - html/js對數據一無所知。只需打印每個字段名稱和相應的值 – Roberto

+0

解決方法是在字段名稱中對硬件代碼進行編號(例如Id_1,LegsNumber_2,NeckLength_3),然後使用它對結果進行排序,但不是非常優雅 – Roberto

回答

2

嘗試用JsonPropertyAttribute歸咎於你的字段是這樣的:

public abstract class Animal 
{ 
    [JsonProperty(Order = 0)] 
    public string Id { get; set; } 

    [JsonProperty(Order = 1)] 
    public int LegsNumber { get; set; } 
} 

public class Giraffe: Animal 
{ 
    [JsonProperty(Order = 2)] 
    public double NeckLength { get; set; } 
} 
+0

對!這是我需要的。不幸的是,它不會影響JsonResult類的行爲,但是我用Newtonsoft.Json.JsonConvert替換它並像魅力一樣工作。 謝謝 – Roberto

+0

唯一的問題是,這有點低效:從RavenDb(json)序列化POCO的結果並且再次在json中反序列化它們。我認爲這是一種直截了當的方式,但這是一個完全不同的問題。 – Roberto

+0

看看這裏:http://james.newtonking.com/archive/2008/10/16/asp-net-mvc-and-json-net.aspx –

0

JSON是不提供基於索引的訪問。 相反,你可以嘗試這樣的事情

for (int i = 0; i < Data.length(); i++) { 
var item=Data.[i]; 

var row = '<tr>'; 
    row += '<td><b>' +item['Id'] + '</b></td>'+'<td><b>' +item['LegsNumber'] + '</b></td>' 
+item['NeckLength'] + '</b></td>'+'<tr>'; 
} 
+0

沒有基於索引的訪問好。但它給出了字段列表。有沒有辦法改變字段列表的順序? 您的解決方案不適用於我,因爲腳本必須在不知道字段名稱的情況下適用於任何Json結構 – Roberto

+1

Json不維護訂單。不過,如果您想維護訂單,請爲包含排序順序的每個項目添加一個整數字段,然後編寫一些自定義JavaScript排序方法。 – amesh