2014-04-25 31 views
1

我想從c#輸出JSON使用谷歌圖表。如何格式JSON谷歌圖表從C#

在使用JSON.Net我建立的那一刻:

JArray arrB =  new JArray(
         from c in cards 
         where c.complete 
           group c by new { date = Convert.ToDateTime(c.completed).Date } into g 
           select new JObject(
            new JProperty("date", g.Key.date), 
            new JProperty("completedHours", g.Sum(x => x.estHours)) 
            ) 
         ); 

,它輸出以下內容:

{ "burndown" : [ { "completedHours" : 30.0, 
[ { "completedHours" : 30.0, 
    "date" : "2014-03-26T00:00:00+00:00" 
    }, 
    { "completedHours" : 3.0, 
    "date" : "2014-04-03T00:00:00+01:00" 
    }, 
    { "completedHours" : 3.0, 
    "date" : "2014-03-28T00:00:00+00:00" 
    }, 
    { "completedHours" : 1.0, 
    "date" : "2014-03-27T00:00:00+00:00" 
    } 
] 

然而,谷歌圖表不喜歡這一點。據我所知,我需要對其進行格式化,以便在第一個數據塊中包含列標題,然後在第一個數據塊中包含列標題。我是JSON的新手,所以不知道如何去解決這個問題。

編輯:添加「正確」的結構

據我可以從谷歌圖表文檔來講,正確的格式應該是這樣的:

{"cols":[{"id":"Col1","label":"","type":"date"}], 
    "rows":[ 
    {"c":[{"v":"a"},{"v":"Date(2010,10,6)"}]}, 
    {"c":[{"v":"b"},{"v":"Date(2010,10,7)"}]} 
    ] 
} 

參見:https://developers.google.com/chart/interactive/docs/reference#dataparam

+0

如果你得到的NuGet的Newtonsoft JSON包,你可以創造任何你想要的對象結構,然後使用該庫來進行編碼到一個JSON字符串。這應該採取所有的猜測和「我是JSON的新手」。 – krillgar

+1

你可以使用所需的JSON結構更新你的問題輸出嗎? –

+0

謝謝。這就是我正在使用的 - 不知道如何改變字符串的格式,默認情況下它按照上面的方式對它進行編碼。你能爲我指出正確的方向嗎? – Ben

回答

1

根據到您的JSON模式,您的對象層次結構需要如下所示:

public class Col 
{ 
    public string id { get; set; } 
    public string label { get; set; } 
    public string type { get; set; } 
} 

public class C 
{ 
    public string v { get; set; } 
} 

public class Row 
{ 
    public List<C> c { get; set; } 
} 

public class RootObject 
{ 
    public List<Col> cols { get; set; } 
    public List<Row> rows { get; set; } 
} 

所以,來構建你的JSON,你會做這樣的事情:

var rootObject = new RootObject() 
{ 
    cols = new List<Col> 
    { 
     new Col {id = "1", label = "2", type = "string"} 
    }, 
    rows = new List<Row>() 
    { 
     new Row 
     { 
      c = new List<C> { 
       new C { v = "a" }, 
       new C { v = "b"} 
      } 
     } 
    } 
};