шарпопочитатель
 Аватар для ht1515
59 / 26 / 7
Регистрация: 31.01.2010
Сообщений: 1,035

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

21.10.2019, 19:19. Показов 2674. Ответов 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 20.04.2026
Отчёт из решения ниже размещен в конфигурации КА2. Задача: отобразить спецтехнику, которая на данный момент находится в ремонте. Есть нетиповой документ "Заявка на ремонт спецтехники" который. . .
Памятка для бота и "визитка" для читателей "Semantic Universe Layer (Слой семантической вселенной)"
Hrethgir 19.04.2026
Сгенерировано для краткого описания по случаю сборки и компиляции скелета серверного приложения. И пусть после этого скажут, что статьи сгенерированные AI - туфта и не интересно. И это не реклама -. . .
Запрет удаления строк ТЧ документа при определенном условии
Maks 19.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "Аккумуляторы", разработанного в конфигурации КА2. У данного документа есть ТЧ, в которой в зависимости от прав доступа. . .
Модель заражения группы наркоманов
alhaos 17.04.2026
Условия задачи сформулированы тут Суть: - Группа наркоманов из 10 человек. - Только один инфицирован ВИЧ. - Колются одной иглой. - Колются раз в день. - Колются последовательно через. . .
Мысли в слух. Про "навсегда".
kumehtar 16.04.2026
Подумалось тут, что наверное очень глупо использовать во всяких своих установках понятие "навсегда". Это очень сильное понятие, и я только начинаю понимать край его смысла, не смотря на то что давно. . .
My Business CRM
MaGz GoLd 16.04.2026
Всем привет, недавно возникла потребность создать CRM, для личных нужд. Собственно программа предоставляет из себя базу данных клиентов, в которой можно фиксировать звонки, стадии сделки, а также. . .
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
Фиксация колонок в отчете СКД
Maks 14.04.2026
Фиксация колонок в СКД отчета типа Таблица. Задача: зафиксировать три левых колонки в отчете. Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка) / / . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru