RizVN Login



Возвращаем на клиент имена Json-параметров с пробелами и прочими символами в Asp.Net MVC

Возвращаем на клиент имена Json-параметров с пробелами и прочими символами в Asp.Net MVCВам никогда не приходилось использовать сторонние JavaScript-ы, которые рассчитывают получить json от сервера? Вы когда-нибудь пытались использовать js-скрипты, изначально написанные с расчетом на другие серверные языки, такие как php и python?Может вы встречали такие незамысловатые обращения к ключам объекта, как object["Some [email protected] With [email protected] "]? Или может вы знаете, что иногда возвращаемый json не обязательно укладывается в красивые рамки жестких классов, которые можно описать через DataContract? Или же использование анонимных классов это ваше кредо?

Основное преимущество Json - это его невероятная гибкость и простота. Вы запросто можете встретить следующий код, и он не будет нарушать стандарт:

{
    "@json" : {
        "value 1" : {
             "/path 12/| 48": "oktet"
        }
    },
    "t-t_t": 12
}

Примечание: Конечно, это немного утрированный пример, но все же он достаточно четко демонстрирует проблему.

Если для обмена данными вы используете жесткие конструкции, которые легко укладываются в шаблоны построения (на подобии xsd для xml), то вы можете обойтись атрибутами DataContract и DataMember, в которых можно указать спец символы и пробелы в именах.

Но, что делать, если Json действительно формируется динамически, включая имена параметров? Составлять строку самостоятельно, при помощи StringBuilder и еже подобным? Ковыряться в поисках забытой запятой или закрывающей фигурной скобки? Согласитесь, что это - не лучшая перспектива.

Примечание: Конечно, использование StringBuilder - это один из самых быстрых способов (по скорости исполнения кода), но все же с ним очень легко ошибиться. Особенно, при составлении больших конструкций, в которых не только быстро возрастает вероятность ошибки, но и необходимое время на исправление таковых. 

Тем не менее, существует более простой выход из ситуации. Способ базируется на том, что стандартный сериализатор asp.net, используемый в JsonResult, умеет корректно преобразовывать объекты-справочники, они же Dictionary. Все ключи, не зависимо от того, содержат они спец символы или нет, будут в итоговом Json-е в том виде, в котором вы их задали. Именно этот факт позволяет полноценно использовать следующий код:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
 
namespace SomeArea
{
    public static class JsonFormHelper
    {
        public static Dictionary<string, dynamic> GetJsonForm(object[] Input)
        {
            if (Input == null || Input.Length % 2 == 1)
                throw new Exception("Некорректный вход. Нельзя составить объект для преобразования в Json");
 
            Dictionary<string, dynamic> Result = new Dictionary<string, dynamic>();
 
            for (var i = 0; i < Input.Length; i += 2)
            {
                if (Input[i] is string || Input[i] is String)
                {
                    if (Input[i + 1] is Array)
                        Result.Add((string)Input[i], GetJsonForm((object[])Input[i + 1]));
                    else
                        Result.Add((string)Input[i], Input[i + 1]);
                }
                else
                    throw new Exception("Некорректный вход. Одно из имен параметров не является строкой");
            }
 
            return Result;
        }
    }
}

Данный хелпер позволяет строить выражения любой формы в простом и понятном виде. На вход функции GetJsonForm передается массив вида [ключ1, значение1, ключ2, значение2, ...], где ключи - это строки, обозначающие имена переменных; а значения содержат либо значение различных сериализуемых типов данных, включая анонимные классы, либо такой же массив вида [ключ11, значение11, ключ21, значение21, ...] (по сути, вложенные объекты). На выходе получается справочник справочников (как бы это не звучало), который легко преобразуется в нужный Json.

Теперь, составить код на сервере (asp.net mvc), который будет возвращать первый пример с json, не составит никакого труда. 

public JsonResult Test()
{
    return new JsonResult()
    {
        JsonRequestBehavior = JsonRequestBehavior.AllowGet,
        Data = JsonFormHelper.GetJsonForm(new object[] {
            "@json", new object[] {
                "value 1", new object[] {
                    "/path 12/| 48", "oktet"
                }
            },
            "t-t_t", 12
        })
    };
}

Вы можете создать данный экшен в любом месте вашего проекта, и убедиться, что результатом выполнения будет требуемый json. 

Если внимательно посмотреться, то видно, что способ построения не только прост, но и в некотором роде повторяет построение любого json-объекта. С одной небольшой разницей в синтаксисе - вместо ":" нужно ставить запятую, а вместо определения объекта через "{}" нужно использовать "new object [] {}". 

Теперь, вы можете динамически составлять json любой сложности, без каких-либо ограничений.

Рубрики:
1 1 1 1 1 1 1 1 1 1 Рейтинг 0.00 (0 Голосов)

Добавить комментарий / отзыв

Комментарий - это вежливое и наполненное смыслом сообщение (правила).


Введите защитный код

Обновить
Защитный код

Каталог программ