kzen.dev
  • Вопросы
  • Метки
  • Пользователи
Оповещения
Вознаграждения
Регистрация
После регистрации, сможете получать уведомления об ответах и комментариях на Ваши вопросы.
Вход
Если у Вас уже есть аккаунт, войдите чтобы проверить новые уведомления.
Тут будут вознаграждения за добавленные вопросы, ответы и комментарий.
Дополнительно
Источник
Редактировать
Daniel Schaffer
Daniel Schaffer
Вопрос

ASP.NET MVC: Управление сериализацией имен свойств с помощью JsonResult

Есть ли способ управлять выводом JSON в JsonResult с помощью атрибутов, подобно тому, как вы можете использовать XmlElementAttribute и его собратьев для управления выводом XML-сериализации?

Например, дан следующий класс:

public class Foo
{
    [SomeJsonSerializationAttribute("bar")]
    public String Bar { get; set; }

    [SomeJsonSerializationAttribute("oygevalt")]
    public String Oygevalt { get; set; }
}

Я хотел бы получить следующий результат:

{ bar: '', oygevalt: '' }

В отличие от:

{ Bar: '', Oygevalt: '' }
31 2009-08-19T22:22:33+00:00 5
Jake Petroules
Jake Petroules
Редактировал вопрос 13-го января 2012 в 2:33
Программирование
serialization
asp.net-mvc
json
Решение / Ответ
Daniel Schaffer
Daniel Schaffer
19-го августа 2009 в 11:11
2009-08-19T23:11:07+00:00
Дополнительно
Источник
Редактировать
#9389301

Я хотел, чтобы в каркас было заложено нечто большее, чем то, что предложил Джарретт, поэтому вот что у меня получилось:

JsonDataContractActionResult:.

public class JsonDataContractActionResult : ActionResult
{
    public JsonDataContractActionResult(Object data)
    {
        this.Data = data;
    }

    public Object Data { get; private set; }

    public override void ExecuteResult(ControllerContext context)
    {
        var serializer = new DataContractJsonSerializer(this.Data.GetType());
        String output = String.Empty;
        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);
    }
}

Метод JsonContract(), добавленный в мой базовый класс контроллера:.

    public ActionResult JsonContract(Object data)
    {
        return new JsonDataContractActionResult(data);
    }

Пример использования:

    public ActionResult Update(String id, [Bind(Exclude="Id")] Advertiser advertiser)
    {
        Int32 advertiserId;
        if (Int32.TryParse(id, out advertiserId))
        {
            // update
        }
        else
        {
            // insert
        }

        return JsonContract(advertiser);
    }

Примечание: Если вы ищете что-то более производительное, чем JsonDataContractSerializer, вы можете сделать то же самое, используя JSON.NET. Хотя JSON.NET не использует DataMemberAttribute, у него есть собственный JsonPropertyAttribute, который можно использовать для достижения того же самого.

Daniel Schaffer
Daniel Schaffer
Редактировал ответ 8-го ноября 2011 в 7:53
38
0
Charlie Kilian
Charlie Kilian
3-го мая 2012 в 7:55
2012-05-03T19:55:33+00:00
Дополнительно
Источник
Редактировать
#9389303

Вот моя реализация ответа Daniel Schaffer', с учетом улучшений, предложенных Justin Rusbatch и Daniel.

using System;
using System.Runtime.Serialization.Json;
using System.Web.Mvc;

public class JsonDataContractActionResult : JsonResult
{
    public JsonDataContractActionResult( Object data )
    {
        this.Data = data;
    }

    public override void ExecuteResult( ControllerContext context )
    {
        var serializer = new DataContractJsonSerializer( this.Data.GetType() );
        context.HttpContext.Response.ContentType = "application/json";
        serializer.WriteObject( context.HttpContext.Response.OutputStream, 
            this.Data );
    }
}
16
0
Danny Pérez
Danny Pérez
1-го мая 2013 в 5:22
2013-05-01T05:22:37+00:00
Дополнительно
Источник
Редактировать
#9389304

Я знаю, это старый вопрос, но для тех, кто ищет, как избежать свойства могут быть сериализованы с помощью кнопок ScriptIgnoreAttribute в пространстве имен System.Веб.Сценарий.Сериализации. К сожалению, все еще могу'т контролировать имя сериализованные свойства, но кто-то может найти это полезным.

public class MyClass {

    [ScriptIgnoreAttribute]
    public bool PropertyNotSerialized { get; set; }

    public bool AnyProperty { get; set; }
}

Будет выводить в JSON результат следующий:

{"AnyProperty ": false}
5
0
 Daniel
Daniel
28-го марта 2014 в 11:33
2014-03-28T11:33:07+00:00
Дополнительно
Источник
Редактировать
#9389305

Это решение использовать NewtonSoft Json.Net (для производительности) Я'вэ нашел часть решения здесь а так

public class JsonNetResult : ActionResult
    {
        public Encoding ContentEncoding { get; set; }
        public string ContentType { get; set; }
        public object Data { get; set; }

        public JsonSerializerSettings SerializerSettings { get; set; }
        public Formatting Formatting { get; set; }

        public JsonNetResult(object data, Formatting formatting)
            : this(data)
        {
            Formatting = formatting;
        }

        public JsonNetResult(object data):this()
        {
            Data = data;
        }

        public JsonNetResult()
        {
            Formatting = Formatting.None;
            SerializerSettings = new JsonSerializerSettings();
        }

        public override void ExecuteResult(ControllerContext context)
        {
            if (context == null)
                throw new ArgumentNullException("context");
            var response = context.HttpContext.Response;
            response.ContentType = !string.IsNullOrEmpty(ContentType)
              ? ContentType
              : "application/json";
            if (ContentEncoding != null)
                response.ContentEncoding = ContentEncoding;

            if (Data == null) return;

            var writer = new JsonTextWriter(response.Output) { Formatting = Formatting };
            var serializer = JsonSerializer.Create(SerializerSettings);
            serializer.Serialize(writer, Data);
            writer.Flush();
        }
    }

Так что в моем контроллере, я могу сделать это

        return new JsonNetResult(result);

В моей модели, я могу теперь есть:

    [JsonProperty(PropertyName = "n")]
    public string Name { get; set; }

Обратите внимание, что теперь, вы должны установить JsonPropertyAttribute каждый дом, вы хотите сериализовать.

4
0
Nate Kohari
Nate Kohari
20-го августа 2009 в 1:18
2009-08-20T01:18:28+00:00
Дополнительно
Источник
Редактировать
#9389302

Простой ответ: DataContractJsonSerializer должен уважать атрибуты [DataContract] и [DataMember] в пространстве имен System.Runtime.Serialization в BCL.

 casperOne
casperOne
Редактировал ответ 13-го января 2012 в 3:11
1
0
Похожие сообщества 12
DotNetRuChat
DotNetRuChat
6 652 пользователей
Чат русскоязычного .NET сообщества http://dotnet.ru/ Правила: https://t.me/DotNetRuChat/704399 Вам могут быть интересны: @dotnetchat, @cilchat, @fsharp_chat, @pro_net, @AvaloniaRU, @xamarin_russia, @DotNetRuJobs, @uwp_ru Флуд в @dotnettalks
Открыть telegram
Вакансии .NET
Вакансии .NET
3 530 пользователей
Правила: https://t.me/DotNetRuJobs/123 Канал с вакансиями - https://t.me/DotNetRuJobsFeed Вам могут быть интересны: @dotnetruchat, @cilchat, @fsharp_chat, @pro_net, @AvaloniaRU, @xamarin_russia Флуд в @dotnettalks
Открыть telegram
pro.net
pro.net
1 820 пользователей
Обсуждение .NET и всего, что с ним связано. Правила: не флудить не по теме, уважать ваших коллег и никакой рекламы (объявления о вакансиях можно согласовать с @AlexFails). https://t.me/pro_net/34653 Флудилка: @dotnettalks
Открыть telegram
var chat = new Chat();
var chat = new Chat();
1 428 пользователей
Обсуждение вопросов по .NET Правила чата – https://blog.devdigest.today/chat-rules Чат для флуда – https://t.me/+zwxI91RGG6s2YzAy
Открыть telegram
.NET Talks - День сурка
.NET Talks - День сурка
1 324 пользователей
Свободный чат .NET разработчиков. Правила: https://t.me/dotnettalks/548269 Вам могут быть интересны: @dotnetruchat, @dotnetchat, @cilchat, @fsharp_chat, @pro_net, @dotnetgroup, @xamarin_russia, @DotNetRuJobs, @uwp_ru, @AvaloniaRu, @dotnettalksenglish
Открыть telegram
Чат конференции DotNext
Чат конференции DotNext
987 пользователей
Канал конференции: @dotnext_channel Ближайшая конференция — DotNext 2022 Autumn, даты будут анонсированы позднее Билеты https://tinyurl.com/DotNext2023Autumn Саппорт: @JUGConfSupport_bot
Открыть telegram
Добавить вопрос
Категории
Все
Технологий
Культура / Отдых
Жизнь / Искусство
Наука
Профессии
Бизнес
Пользователи
Все
Новые
Популярные
1
Ilya Smirnov
Зарегистрирован 6 дней назад
2
Денис Васьков
Зарегистрирован 1 неделю назад
3
Dima Patrushev
Зарегистрирован 1 неделю назад
4
sirojidddin otaboyev
Зарегистрирован 2 недели назад
5
Елена Гайдамамакинат
Зарегистрирован 2 недели назад
KO
RU
© kzen.dev 2023
Источник
stackoverflow.com
под лицензией cc by-sa 3.0 с атрибуцией