Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.54/13: Рейтинг темы: голосов - 13, средняя оценка - 4.54
шарпопочитатель
 Аватар для ht1515
59 / 26 / 7
Регистрация: 31.01.2010
Сообщений: 1,035

Преобразовать JSON camelCase to PascalCase

21.10.2019, 19:19. Показов 2653. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Есть текст JSON, модели данных нету. Можно ли преобразовать ключи(свойства) JSON из camelCase в PascalCase?
Для JS есть https://stackoverflow.com/ques... -camelcase
Но надо на C#
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
21.10.2019, 19:19
Ответы с готовыми решениями:

Flask и SQLAlchemy и JSON. Не получается преобразовать результат запроса в json
У меня есть БД построенная из этих моделей с помощью миграций: # Class Class stores info about dish categories class...

Конвертировать из PascalCase в snake_case
сделал так, но почему-то, некоторые сточки обрезаются, хотелось бы услышать советов или кто-нибудь покажет свои реализации. public...

JSON, преобразовать данные
Есть JSON-объект: { "22" : , "34" : } нужно преобразовать к виду: {

4
163 / 138 / 35
Регистрация: 25.11.2015
Сообщений: 910
21.10.2019, 21:16
Библиотека NewtonsoftJson. При десериализации или указываешь названия полей как воно должно быть или настраиваешь правила маппинга
0
Злой няш
 Аватар для I2um1
2136 / 1505 / 565
Регистрация: 05.04.2010
Сообщений: 2,881
22.10.2019, 21:37
Самое быстрое и простое решение - решение в лоб, используя регулярные выражения:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
using System;
using System.Globalization;
using System.Text.RegularExpressions;
 
namespace Demo
{
    public class Program
    {
        public static void Main()
        {
            const string inputJson =
@"{
    ""testObject"": {
        ""testValue"": 5,
        ""testArray"": [
            { ""testArrayValue1"": 10 },
            { ""testArrayValue2"": 12 }
        ]
    }
}";
 
            var outputJson = Regex.Replace(
                inputJson,
                @"""(\w*)""\s*:",
                match => ToPascalCase(match, CultureInfo.InvariantCulture),
                RegexOptions.IgnoreCase);
 
            Console.WriteLine(outputJson);
        }
 
        private static string ToPascalCase(Match match, CultureInfo cultureInfo)
        {
            var propertyName = ToPascalCase(match.Groups[1].ToString(), cultureInfo);
            return $@"""{propertyName}"":";
        }
 
        private static string ToPascalCase(string camelCaseText, CultureInfo cultureInfo)
        {
            if (string.IsNullOrEmpty(camelCaseText))
            {
                return camelCaseText;
            }
 
            var charArray = camelCaseText.ToCharArray();
            charArray[0] = char.ToUpper(charArray[0], cultureInfo);
            return new string(charArray);
        }
    }
}

Попробовал реализовать на Newtonsoft.Json и на System.Text.Json:


Regex - решение на регулярных выражениях, код выше.
Compiled Regex - тоже самое, что Regex, только использовался RegexOption.Compiled параметр.
Newtonsoft.Json - аллокация нового дерева с изменением имени свойства, да~ и код значительно сложнее:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
private static JToken ToPascalCaseJToken(JToken original, CultureInfo cultureInfo)
{
    return original.Type switch
    {
        JTokenType.Object => ToPascalCase((JObject)original, cultureInfo),
        JTokenType.Array => new JArray(((JArray)original).Select(x => ToPascalCaseJToken(x, cultureInfo))),
        _ => original.DeepClone()
    };
}
 
private static JObject ToPascalCase(JObject original, CultureInfo cultureInfo)
{
    var newObj = new JObject();
    foreach (JProperty property in original.Properties())
    {
        var newPropertyName = ToPascalCase(property.Name, cultureInfo);
        newObj[newPropertyName] = ToPascalCaseJToken(property.Value, cultureInfo);
    }
 
    return newObj;
}
System.Text.Json - новая библиотека в .NET Core 3.0, причем было заявлено, что она работает на UTF-8 и гораздо быстрее Newtonsoft.Json. В тесте я использовал JsonDocument и точно такой же обход дерева по JsonElement с аллокацией памяти на каждой ноде. Вариант "just copy" без аллокации памяти и без обхода дерева, просто десериализация и сериализация.
1
шарпопочитатель
 Аватар для ht1515
59 / 26 / 7
Регистрация: 31.01.2010
Сообщений: 1,035
22.10.2019, 21:49  [ТС]
Спасибо нашел еще решение, сейчас поделюсь. Оно было сдернуто с SO.
C#
1
2
3
4
5
6
7
8
           
 var settings = new JsonSerializerSettings()
            {
                ContractResolver = new CamelCasePropertyNamesContractResolver(),
                Converters = new List<JsonConverter> { new CamelCaseToPascalCaseExpandoObjectConverter() }
            };
            dynamic deserialized = JsonConvert.DeserializeObject<ExpandoObject>(txt, settings);
            return JsonConvert.SerializeObject(deserialized, Newtonsoft.Json.Formatting.None);
txt - это текст json.

Но нужно реализовать CamelCaseToPascalCaseExpandoObjectConver ter
Вот тут написано как это сделать
https://stackoverflow.com/ques... h-json-net
0
163 / 138 / 35
Регистрация: 25.11.2015
Сообщений: 910
23.10.2019, 07:43
Ну, или в модель забиваешь атрибуты где указываешь как должно называться поле в Json. Хоть это статика, а не динамика, но сериализация-десериализация проходит по одним правилам и их не надо переписывать )

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
[DataContract]
    public class ResponseViewModel
    {
        [DataMember(Name = "isSuccess")]
        public bool IsSuccess { get; set; } = true;
        [DataMember(Name = "message")]
        public string Message { get; set; } = string.Empty;
        [DataMember(Name = "statusCode")]
        public int StatusCode { get; set; } = StatusCodes.Status200OK;
 
        public ResponseViewModel()
        {
        }
 
        public ResponseViewModel(string message, int status = StatusCodes.Status400BadRequest, bool success = false)
        {
            IsSuccess = success;
            Message = message;
            StatusCode = status;
        }
 
        
    }
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
23.10.2019, 07:43
Помогаю со студенческими работами здесь

Преобразовать JSON в Unicode
{&quot;title&quot;:&quot;\u0423\u043d\u0438\u0432\u0435\u0440\u0441\u0430\u043b&quot;,&quot;tracks&quot;: как это преобразовать в норм вид? ...

CamelCase по словарю
Проблема следующая. 1. Есть некий набор строк, состоящих из маленьких латинских букв и цифр. Каждая такая строка представляет собой...

CamelCase в базе
весь код в php в CamelCase стиле.. в базе данных было бы удобно так же использовать этот стиль, хотябы для того чтобы избежать лишних...

Преобразовать данные из БД в формат JSON
Всем привет. Суть вопроса: Есть созданная таблица в phpmyadmin, данные. Как эти данные преобразить в массив json. Я...

Как преобразовать JSON в массив?
По API в ответ получаю {&quot;as&quot;:&quot;AS21017 35, Revolutsii prosp.&quot;,&quot;city&quot;:&quot;Voronezh&quot;, ... ,&quot;zip&quot;:&quot;394000&quot;} Как преобразовать в массив, может...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
Отправка уведомления на почту при изменении наименования справочника
Maks 24.03.2026
Программная отправка письма электронной почты на примере изменения наименования типового справочника "Склады" в конфигурации БП3. Перед реализацией необходимо выполнить настройку системной учетной. . .
модель ЗдравоСохранения 5. Меньше увольнений- больше дохода!
anaschu 24.03.2026
Теперь система здравосохранения уменьшает количество увольнений. 9TO2GP2bpX4 a42b81fb172ffc12ca589c7898261ccb/ https:/ / rutube. ru/ video/ a42b81fb172ffc12ca589c7898261ccb/ Слева синяя линия -. . .
Midnight Chicago Blues
kumehtar 24.03.2026
Такой Midnight Chicago Blues, знаешь?. . Когда вечерние улицы становятся ночными, а ты не можешь уснуть. Ты идёшь в любимый старый бар, и бармен наливает тебе виски. Ты смотришь на пролетающие. . .
SDL3 для Desktop (MinGW): Вывод текста со шрифтом TTF с помощью библиотеки SDL3_ttf на Си и C++
8Observer8 24.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-text-sdl3-c. zip finish-text-sdl3-cpp. zip
Жизнь в неопределённости
kumehtar 23.03.2026
Жизнь — это постоянное существование в неопределённости. Например, даже если у тебя есть список дел, невозможно дойти до точки, где всё окончательно завершено и больше ничего не осталось. В принципе,. . .
Модель здравоСохранения: работники работают быстрее после её введения.
anaschu 23.03.2026
geJalZw1fLo Корпорация до введения программа здравоохранения имела много невыполненных работниками заданий, после введения программы количество заданий выросло. Но на выплатах по больничным это. . .
Контроль уникальности заводского номера
Maks 23.03.2026
Алгоритм контроля уникальности заводского (или серийного) номера на примере нетипового документа выдачи шин для спецтехники с табличной частью, разработанного в конфигурации КА2. Данные берутся из. . .
Хочу заставить корпорации вкладываться в здоровье сотрудников: делаю мат модель здравосохранения
anaschu 22.03.2026
e7EYtONaj8Y Z4Tv2zpXVVo https:/ / github. com/ shumilovas/ med2. git
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru