Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.56/9: Рейтинг темы: голосов - 9, средняя оценка - 4.56
169 / 132 / 29
Регистрация: 16.02.2013
Сообщений: 867

Десериализация Json - как правильно?

04.10.2014, 00:33. Показов 1973. Ответов 9
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Накатал простой пример -
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
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
using System;
using Newtonsoft.Json;
using Newtonsoft;
 
namespace json_test
{
     
    class Program
    {
        static void Main(string[] args)
        {
            string a="{\"response\":{\"status\":\"ok\"},\"data\":{\"name\":\"jack\",\"year\":22}}";
/*
 
 {
    "status":
    {
        "value":"ok"
    },
    "info":
    {
        "name":"jack",
        "year":22
    }
 }
 
*/
        string b="{\"status\":\"error\",\"message\":\"No Auth\"}";
        
/*
 
{
    "value":"error",
    "message":"No Auth"
}
 
*/
        Info info_obj=JsonConvert.DeserializeObject<Info>(a);
        Console.WriteLine("status - {0}",info_obj.Response.Status);
        Console.ReadKey();
            
        }
    }
    
    class Info
    {
        [JsonProperty("response")]
        public Response Response{get;set;}
        [JsonProperty("data")]
        public Data Data{get;set;}
    }
    
    class Response
    {
        [JsonProperty("status")]
        public string Status{get;set;}
    }
    
    class Data
    {
        [JsonProperty("name")]
        public string Name{get;set;}
        [JsonProperty("year")]
        public string Year{get;set;}
    }
    
    
}
от сервера может прийти строка как "a", так и "b". Собственно в первом случае мы имеем 2 обьекта, во втором - 1.
Если десериализовать 1 (a) строку в обьект класса Info - то все будет нормально. Если вторую - приложение падает, что очевидно. Как правильно парсить?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
04.10.2014, 00:33
Ответы с готовыми решениями:

Десериализация JSON
Есть данные от известного источника в JSON: {&quot;response&quot;:} При помощи Newtonsoft.Json они успешно распарсиваются в структуру: public...

Десериализация JSON
Как для такого формата класс создать? , , ] исп. Newtonsoft.Json var myclass =...

Десериализация Newtonsoft.Json
Возникла жизненная необходимость сохранять текущее состояние с возможностью снова восстановиться к нему. В моём коде происходит...

9
871 / 721 / 304
Регистрация: 15.04.2013
Сообщений: 2,047
Записей в блоге: 5
04.10.2014, 02:03
Winhttp22,
Чем вам не угодил стандартный класс десереализации JSON?
0
169 / 132 / 29
Регистрация: 16.02.2013
Сообщений: 867
04.10.2014, 02:28  [ТС]
XRoy, а как это решит проблему?
0
Эксперт .NET
 Аватар для Casper-SC
4434 / 2094 / 404
Регистрация: 27.03.2010
Сообщений: 5,657
Записей в блоге: 1
04.10.2014, 09:46
Если бы строка имела вид:
string b = "{\"response\":{\"status\":\"error\",\"m essage\":\"No Auth\"}}";
То всё бы работало. А повлиять на то в каком виде приходит b никак нельзя?
0
 Аватар для Cupko
654 / 591 / 171
Регистрация: 17.07.2012
Сообщений: 1,680
Записей в блоге: 1
04.10.2014, 10:09
Winhttp22,
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
class Program
{
    static void Main(string[] args)
    {
 
        string b = "{\"status\":\"error\",\"message\":\"No Auth\"}";
        string a = "{\"response\":{\"status\":\"ok\"},\"data\":{\"name\":\"jack\",\"year\":22}}";
 
        Console.WriteLine(Deserialize(a));
        Console.ReadKey();
    }
 
    static string Deserialize(string inputString)
    {
        var jss = new System.Web.Script.Serialization.JavaScriptSerializer();
        dynamic data = jss.Deserialize<dynamic>(inputString);
 
        var dict = ((Dictionary<string,object>)data);
        if (dict.ContainsKey("response"))
            return "This is 'a'";
 
        if (dict.ContainsKey("status"))
            return "This is 'b'";
 
        return "Undefinied string";
    }
}
2
28 / 28 / 5
Регистрация: 24.03.2013
Сообщений: 238
04.10.2014, 16:33
C#
1
using Newtonsoft.Json;
LINQ to JSON -> Parsing JSON
0
169 / 132 / 29
Регистрация: 16.02.2013
Сообщений: 867
05.10.2014, 01:34  [ТС]
Casper-SC, в том то и дело - что нет
0
Кодогенератор
 Аватар для hepper
200 / 200 / 51
Регистрация: 15.06.2011
Сообщений: 794
05.10.2014, 08:46
может вот так сойдет?

Кликните здесь для просмотра всего текста
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
50
51
52
53
54
55
56
namespace ConsoleApplication6
{
    class Program
    {
        static void Main(string[] args)
        {
            string a = "{\"response\":{\"status\":\"ok\"},\"data\":{\"name\":\"jack\",\"year\":22}}";
            string b = "{\"status\":\"error\",\"message\":\"No Auth\"}";
            var t = Deserialize(b);
        }
 
        static RootObject Deserialize(string inputString)
        {
            var jss = new System.Web.Script.Serialization.JavaScriptSerializer();
            if (!inputString.Contains("response"))
                inputString = "{\"response\":" + inputString + "}";
            var data = jss.Deserialize<RootObject>(inputString);
            return data;
        }
    }
 
    public class Data
    {
        public string Name { get; set; }
 
        public string Year { get; set; }
 
        public Data()
        {
        }
    }
 
    public class Response
    {
        public string Status { get; set; }
 
        public string Message { get; set; }
 
        public Response()
        {
        }
    }
 
    public class RootObject
    {
        public Response Response { get; set; }
 
        public Data Data { get; set; }
 
        public RootObject()
        {
            Response = new Response();
            Data = new Data();
        }
    }
}
1
Почетный модератор
Эксперт .NET
 Аватар для NickoTin
8725 / 3677 / 404
Регистрация: 14.06.2010
Сообщений: 4,513
Записей в блоге: 9
05.10.2014, 12:54
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
        static void Main ( string[] args )
        {
            string a = "{\"response\":{\"status\":\"ok\"},\"data\":{\"name\":\"jack\",\"year\":22}}";
            string b = "{\"status\":\"error\",\"message\":\"No Auth\"}";
 
            var jObj = JObject.Parse( b );
 
            Response resp;
            Info info = null;
 
            if ( jObj["response"] != null )
            {
                info = jObj.ToObject<Info>();
                resp = info.Response;
            }
            else
                resp = jObj.ToObject<Response>();
        }
 
 
        class Info
        {
            [JsonProperty( "response" )]
            public Response Response { get; set; }
            [JsonProperty( "data" )]
            public Data Data { get; set; }
        }
 
        class Response
        {
            [JsonProperty( "status" )]
            public string Status { get; set; }
            [JsonProperty( "message" )]
            public string Meessage { get; set; }
        }
 
        class Data
        {
            [JsonProperty( "name" )]
            public string Name { get; set; }
            [JsonProperty( "year" )]
            public string Year { get; set; }
        }
2
1195 / 588 / 88
Регистрация: 20.09.2012
Сообщений: 1,881
08.10.2014, 09: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
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
using System;
using Newtonsoft.Json;
using Newtonsoft;
 
namespace ConsoleCyber
{
    interface IError
    {
       string status { get; set; }
       string message { get; set; }
    }
 
    interface IData
    {
        string name { get; }
        string year { get; }
    }
 
    public class FullResponse : IData, IError
    {
        public class Data
        {
            public string name { get; set; }
            public string year { get; set; }
        }
        public class Response
        {
            public string status { get; set; }
        }
        public Response response { get; set; }
        string IData.name { get { return data.name; } }
        string IData.year { get { return data.year; } }
        public Data data { get; set; }
        public string status { get; set; }
        public string message { get; set; }
    }
 
 
 
 
    class Program
    {
        private static void Main(string[] args)
        {
            string a = "{\"response\":{\"status\":\"ok\"},\"data\":{\"name\":\"jack\",\"year\":22}}";
            string b = "{\"status\":\"error\",\"message\":\"No Auth\"}";
            FullResponse value = JsonConvert.DeserializeObject<FullResponse>(a);
            show(value);
            value = JsonConvert.DeserializeObject<FullResponse>(b);
            show(value);
 
            Console.ReadKey();
        }
 
        private static void show(FullResponse value)
        {
            if (value.response == null) {
                IError err = value;
                Console.WriteLine("Error: {0}: {1}", err.status, err.message);
            }
            else
            {
                IData dat = value;
                Console.WriteLine("Data: {2}: {0}: {1}", dat.name, dat.year, value.response.status);
            }
        }
    }
 
}
https://dotnetfiddle.net/28jgBs
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
08.10.2014, 09:37
Помогаю со студенческими работами здесь

Не работает десериализация JSON
У меня есть класс Doctor который принимает значение: public class Doctor { public string doctorsId { get; set; } ...

Десериализация JSON ничего не выводит
Здравствуйте, подскажите что делаю не так. Смотрел мануалы и у всех все работает а у меня выводит пустоту. if...

Сериализация и десериализация в Json нескольких разных классов
Добрый день. Стоит такая задача. Есть приложение которое сериализует данные, есть второе приложение которое эти данные десериализует. К...

Как правильно спарсить JSON ответ?
Всем привет! Помогите, пожалуйста, с обработкой JSON ответа. Я привёл часть файла, на самом деле, в data порядка 100+ объектов. { ...

Как правильно десериализовать ответ в Json
Как правильно десериализовать ответ в Json (С вложенными классами) используя библиотеку Newtonsoft.Json? { &quot;success&quot;:...


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru