2012-12-19 13 views
9

Sto cercando di creare i seguenti dati JSON:Creare JSON con C# Oggetto

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

Sto usando C# e cercando di creare un oggetto per fare questo ..... qualcosa di simile:

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

ma ovviamente non posso avere proprietà contenenti spazi.

Come faccio a fare questo?

UPDATE:

Utilizzando la risposta di JamieC le seguenti opere in ottima

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; } 

    } 
} 

che produce:

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

Intendi "proprietà che contengono punti (punti)" invece? –

risposta

10

Il solito modo per farlo è quello di utilizzare un DataContractJsonSerializer per trasformare il vostro oggetto in JSON, e utilizzare DataMember attributi per annotare ciò che i nomi da utilizzare per le proprietà:

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

Io personalmente uso il mio ActionResult per avvolgere la serializzazione in 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); 
    }   
} 

E ritorno che da un metodo di supporto in un controller di base:

public abstract class MyBaseController: Controller 
{ 

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

} 

Poi il mio controller diventa molto semplice:

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

Grazie JamieC: la parte semplice ora funziona. Aggiungerà i tuoi metodi dopo :) –

2

È possibile utilizzare libreria JSON.NET, è possibile scaricarlo dal here

Si ha questa caratteristica:

Nome attributo proprietà personalizzazione

Questa domanda vi aiuterà a:

Json.Net: JsonSerializer-Attribute for custom naming

ed è possibile utilizzare DataContractJsonSerializer fornisce questa funzionalità, ma JavaScriptSerializer non lo è.

+1

Assolutamente. Biblioteca impressionante –

0

Per il progetto MVC Newtonsoft.Json libreria è disponibile (è necessario includere manualmente questo per altri progetti)

Quindi dare JsonProperty nel modello, come questo. ...

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

e utilizzare Newtonsoft.Json.JsonConvert.SerializeObject(object); o Json.Encode(object) da convertire in JSON.