0

Razor ビューで JSON を直接出力しようとしています。シリアル化されるオブジェクトはIEnumerable<ItemDto>(以下の定義を参照) です。から返される同一の JSON にシリアル化したいですApiController。これが私が試したことです:

  • を使用する@Json.Encode(theValue)と、 が無視されるDataMemberため、プロパティの名前が間違っています (最初の文字が大文字)。
  • を使用DataContractJsonSerializer(およびキャスト)すると、 asが出力IEnumerable<ItemDto>されますが、ApiController は正しく出力されます。IList<ItemDto>ImageDto.Sizes[{ Key: 'foo', Value: <object> }]{ 'foo': <object> }

ここに私のクラスがあります:

    [DataContract]
    public class ItemDto
    {
        [DataMember(Name = "id")]
        public int Id { get; set; }

        [DataMember(Name = "title")]
        public string Title { get; set; }

        [DataMember(Name = "image")]
        public ImageDto Image { get; set; }

        [DataMember(Name = "price")]
        public decimal Price { get; set; }
    }

    [DataContract]
    public class ImageDto
    {
        [DataMember(Name = "id")]
        public Guid Id { get; set; }
        [DataMember(Name = "sizes")]
        public Dictionary<String, ImageSizeDto> Sizes { get; set; }
    }

    [DataContract]
    public class ImageSizeDto
    {
        [DataMember(Name = "url")]
        public string Url { get; set; }
        [DataMember(Name = "w")]
        public int Width { get; set; }
        [DataMember(Name = "h")]
        public int Height { get; set; }
    }

GET目的は、ほぼすべてのページで必要なデータの個別の要求を回避することです。

必要な JSON:

[{"id":6,
 "title":"Foo bar baz",
 "image":
    {"id":"fb2a3b4a-5ae5-4d9d-baff-72e107aa6e9c",
     "sizes":
        {"Original": {"url":"http://example.com/a", "w":-1, "h":-1},
         "Thumbnail": {"url":"http://example.com/b", "w":130, "h":73},
         "LargeThumbnail": {"url":"http://example.com/c", "w":220,"h":124},
         "Popup": {"url":"http://example.com/d", "w":256, "h":256},
         "FullWidth": {"url":"http://example.com/e", "w":930, "h":524}}},
 "price":79}]
4

1 に答える 1

1

Json.NETを使用できます。

[DataContract]
public class ItemDto
{
    [DataMember(Name = "id")]
    public int Id { get; set; }

    [DataMember(Name = "title")]
    public string Title { get; set; }

    [DataMember(Name = "image")]
    public ImageDto Image { get; set; }

    [DataMember(Name = "price")]
    public decimal Price { get; set; }
}

[DataContract]
public class ImageDto
{
    [DataMember(Name = "id")]
    public Guid Id { get; set; }
    [DataMember(Name = "sizes")]
    public Dictionary<String, ImageSizeDto> Sizes { get; set; }
}

[DataContract]
public class ImageSizeDto
{
    [DataMember(Name = "url")]
    public string Url { get; set; }
    [DataMember(Name = "w")]
    public int Width { get; set; }
    [DataMember(Name = "h")]
    public int Height { get; set; }
}

class Program
{
    static void Main()
    {
        var items = new[] 
        {
            new ItemDto
            {
                Id = 6,
                Title = "Foo bar baz",
                Image = new ImageDto
                {
                    Id = Guid.NewGuid(),
                    Sizes = new Dictionary<string, ImageSizeDto>
                    {
                        { "Original", new ImageSizeDto { Url = "http://example.com/a", Width = -1, Height = -1 } },
                        { "Thumbnail", new ImageSizeDto { Url = "http://example.com/b", Width = 130, Height = 73 } },
                    },
                },
                Price = 79
            }
        };

        Console.WriteLine(JsonConvert.SerializeObject(items));
    }
}

出力:

[
    {
        "id": 6,
        "title": "Foo bar baz",
        "image": {
            "id": "6a1c1d34-3e78-4303-8edd-d8541dd915e7",
            "sizes": {
                "Original": {
                    "url": "http://example.com/a",
                    "w": -1,
                    "h": -1
                },
                "Thumbnail": {
                    "url": "http://example.com/b",
                    "w": 130,
                    "h": 73
                }
            }
        },
        "price": 79
    }
]

ASP.NET MVC 4 RTM では、Json.Net がデフォルトの serialzierになることに注意してください。それまでは、Scott Hanselman のブログ投稿に示されているように、ビルトイン シリアライザーを Json.NET に交換するだけです。

于 2012-06-19T08:18:16.473 に答える