使用C#对象创建JSON

使用C#对象创建JSON,c#,asp.net-mvc,json,C#,Asp.net Mvc,Json,我正在尝试创建以下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#并

我正在尝试创建以下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;}
}
但显然我不能有包含空格的属性

我该怎么做呢

更新:

使用JamieC的答案,下面的工作非常有效

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

    }
}

您可以使用JSON.NET库,您可以从

它有以下特点:

属性属性名称自定义

这个问题将帮助您:


您可以使用DataContractJsonSerializer它提供此功能,但JavaScriptSerializer不是。

通常的方法是使用
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);
    }
}

对于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。

您的意思是“包含句点的属性”吗?绝对正确。很棒的库。谢谢JamieC-现在简单的部分可以用了。将在下一步添加您的方法:)
public class ChartModel{
    [JsonProperty("chart.labels")]
    public string[] Labels {get;set;}
    [JsonProperty("chart.tooltips")]
    public string[] Tooltips {get;set;}
}