8

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

    }
}

生成するもの:

{"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"]}
4

3 に答える 3

9

これを行う通常の方法は、 a を使用し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);
    }
}
于 2012-12-19T14:24:07.387 に答える
2

JSON.NET ライブラリを使用できます。ここからダウンロードできます。

次の機能があります。

属性プロパティ名のカスタマイズ

この質問は次のことに役立ちます。

Json.Net: カスタム命名のための JsonSerializer-Attribute

また、この機能を提供するDataContractJsonSerializerを使用できますが、 JavaScriptSerializerは使用できません。

于 2012-12-19T14:23:16.033 に答える
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);orを使用Json.Encode(object)して JSON に変換します。

于 2014-01-28T08:30:03.727 に答える