2012-12-19 142 views
9

我試圖創建以下JSON數據:用C#對象創建JSON

{ 
'chart.labels': ['Bob','Lucy','Gary','Hoolio'], 
'chart.tooltips': ['Bob did well', 
       'Lucy had her best result', 
       'Gary - not so good', 
       'Hoolio had a good start' 
       ] 
} 

我使用C#,並試圖以這樣做是爲了創建一個對象.....類似:

public class chart{ 
public string[] chart.labels {get;set;} 
public string[] chart.tooltips {get;set;} 
} 

但顯然我不能有包含空格的屬性。

我該怎麼做呢?

UPDATE:

使用JamieC的回答了以下工作perfecly

public virtual ActionResult CompanyStatus() 
    { 
     var labelList = new List<string>() { "Bob", "Lucy", "Gary", "Hoolio" }; 
     var tooltipsList = new List<string>() { "Bob did well", "Lucy had her best result", "Gary - not so good", "Hoolio had a good start" }; 

     var cData = new chartData() 
     { 
      Labels = labelList.ToArray(), 
      Tooltips = tooltipsList.ToArray() 
     }; 

     var serializer = new DataContractJsonSerializer(cData.GetType()); 
     String output; 
     using (var ms = new MemoryStream()) 
     { 
      serializer.WriteObject(ms, cData); 
      output = Encoding.Default.GetString(ms.ToArray()); 
     } 

     return this.Content(output); 
    } 


    [DataContract] 
    public class chartData 
    { 
     [DataMember(Name = "chart.labels")] 
     public string[] Labels { get; set; } 

     [DataMember(Name = "chart.tooltips")] 
     public string[] Tooltips { get; set; } 

    } 
} 

主要生產:

{"chart.labels":["Bob","Lucy","Gary","Hoolio"],"chart.tooltips":["Bob did well","Lucy had her best result","Gary - not so good","Hoolio had a good start"]} 
+1

你的意思是「包含句點(點)的屬性」而不是? –

回答

10

通常的方式做到這一點是使用DataContractJsonSerializer把你的對象變成JSON和使用DataMember屬性標註使用什麼名字屬性:

[DataContract] 
public class ChartModel{ 
[DataMember(Name = "chart.labels")] 
public string[] Labels {get;set;} 
[DataMember(Name = "chart.tooltips")] 
public string[] Tooltips {get;set;} 
} 

我個人用我自己的ActionResult包起來MVC序列化:

public class JsonDataContractResult : ActionResult 
{ 
    public JsonDataContractResult(Object data) 
    { 
     this.Data = data; 
    } 

    protected JsonDataContractResult() 
    { 

    } 

    public Object Data { get; private set; } 

    public override void ExecuteResult(ControllerContext context) 
    { 
     Guard.ArgumentNotNull(context, "context"); 

     var serializer = new DataContractJsonSerializer(this.Data.GetType()); 
     String output; 
     using (var ms = new MemoryStream()) 
     { 
      serializer.WriteObject(ms, this.Data); 
      output = Encoding.Default.GetString(ms.ToArray()); 
     } 
     context.HttpContext.Response.ContentType = "application/json"; 
     context.HttpContext.Response.Write(output); 
    }   
} 

並返回從一個輔助方法在基本控制器:

public abstract class MyBaseController: Controller 
{ 

    protected JsonDataContractResult JsonContract(Object data) 
    { 
     return new JsonDataContractResult(data); 
    } 

} 

然後我控制器變得非常簡單:

public class SomeController: MyBaseController 
{ 
    public ActionResult SomeAction() 
    { 
     var model = new ChartModel() 
        { 
         Labels = ..., 
         Tooltips = ... 
        }; 
     return JsonContract(model); 
    } 
} 
+0

謝謝JamieC - 現在就完成簡單的工作。將添加您的方法下一步:) –

2

您可以使用JSON.NET庫,你可以從here下載

它具有這樣的特徵:

屬性的屬性名稱定製

這個問題將有助於你:

Json.Net: JsonSerializer-Attribute for custom naming

你也可以使用DataContractJsonSerializer它提供了這個功能,但JavaScriptSerializer不是。

+1

當然。真棒圖書館。 –

0

對於MVC項目Newtonsoft.Json庫可(您必須手動包括本用於其他項目)

所以給JsonProperty在模型中,像這樣的。 ...

public class ChartModel{ 
    [JsonProperty("chart.labels")] 
    public string[] Labels {get;set;} 
    [JsonProperty("chart.tooltips")] 
    public string[] Tooltips {get;set;} 
} 

,並使用Newtonsoft.Json.JsonConvert.SerializeObject(object);Json.Encode(object)轉換爲JSON。