2012-12-19 20 views
9

Próbuję utworzyć następujące dane JSON:Tworzenie JSON z C# obiektu

{ 
'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' 
       ] 
} 

używam C# i próbuje utworzyć obiekt w tym celu ..... coś takiego:

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

ale oczywiście nie mogę mieć właściwości zawierających spacje.

Jak miałbym to zrobić?

UPDATE:

Korzystanie odpowiedź JamieC za następujące prace 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; } 

    } 
} 

która produkuje:

{"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

Czy chodzi ci o "właściwości zawierające kropki (kropki)"? –

Odpowiedz

10

Zwykłym sposobem, aby to zrobić jest użycie DataContractJsonSerializer aby włączyć swój obiekt do JSON i użyć DataMember przypisuje opisywanie co nazwy używać do właściwości:

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

osobiście użyć własnego ActionResult owinąć up serializacji w 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); 
    }   
} 

i powrócić że z metody pomocnika w sterowniku bazowym:

public abstract class MyBaseController: Controller 
{ 

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

} 

Wtedy mój kontroler staje się naprawdę prosta:

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

Dzięki JamieC - Mam teraz prostą część roboczą. Dodam twoje metody dalej :) –

2

Można użyć biblioteki Json.NET, można go pobrać ze here

Ma tę funkcję:

Nazwa atrybutu właściwość dostosowywania

To pytanie pomoże ci:

Json.Net: JsonSerializer-Attribute for custom naming

i można korzystać DataContractJsonSerializer zapewnia tę funkcję, ale JavaScriptSerializer nie jest.

+1

Absolutnie. Niesamowita biblioteka. –

0

Dla projektu MVC Newtonsoft.Json Biblioteka jest dostępny (trzeba ręcznie włączyć go do innych projektów)

Więc daj JsonProperty w modelu, jak ten. ...

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

i używać Newtonsoft.Json.JsonConvert.SerializeObject(object); lub Json.Encode(object) przekonwertować do formatu JSON.