10 / 10 / 1
Регистрация: 27.11.2011
Сообщений: 153
1

Вложенность типов адресса: улица, дом, квартира

31.08.2017, 18:47. Показов 2062. Ответов 8

Author24 — интернет-сервис помощи студентам
Добрый вечер. Есть 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
public static class Quests
        {
            public static List<Street> Addresses { get; set; }
        }
 
        public class Street
        {
            public string Name { get; set; }
 
            public List<House> Houses { get; set; }
        }
 
        public class House
        {
            public string Number { get; set; }
 
            public Flat Flats { get; set; }
        }
 
        public class Flat
        {
            public List<int> Numbers { get; set; }
        }
Класс Quests статический, потому что делаю я это под андроид, и перекидывать данные с одного активити в другое задача не из лучших. Так же для конвертации json я использовал
C#
1
RestSharp.SimpleJson
, но может есть инструменты получше?

P.S. Повлиять на серверную часть и структуру json нельзя.
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
31.08.2017, 18:47
Ответы с готовыми решениями:

Дан массив данных о клиентах пункта проката: фамилия, имя, отчество, адрес (улица, дом, квартира)
2. Дан массив данных о клиентах пункта проката: фамилия, имя, отчество, адрес (улица, дом,...

Классы дом,улица,город
Обязательно реализовать в каждом классе метод ToString, который будет форматировать вывод...

Классы улица, дом и город
Обязательно реализовать в каждом классе метод ToString, который будет форматировать вывод...

Организовать иерархию классов: дом, улица, город
Обязательно реализовать в каждом классе метод ToString, который будет форматировать вывод...

8
Эксперт .NET
5531 / 4296 / 1216
Регистрация: 12.10.2013
Сообщений: 12,329
Записей в блоге: 2
31.08.2017, 19:59 2
lFreeManl, немного не понятно, что вам требуется...
Вот этот инструмент приводит к довольно простому коду, как ниже. А вам что нужно сделать?
C#
1
2
3
4
5
6
7
8
public class RootObject
{
    public string watcher_name { get; set; }
    public string date { get; set; }
    public string street { get; set; }
    public string house { get; set; }
    public string flat { get; set; }
}
0
10 / 10 / 1
Регистрация: 27.11.2011
Сообщений: 153
31.08.2017, 20:19  [ТС] 3
insite2012, смотрите, в моем json есть елемент "street", сначала группируем элементы по нему, в моем случае должно получиться:
Javascript
1
2
3
4
5
Литовська
Яроша
Весела дача
Весела
Вечірній
Теперь для каждой улицы нужно выбрать дома "house", что к ней относятся (в моем примере домов всего по 1, но на самом деле их там может быть больше 100):
Javascript
1
2
3
4
5
Литовська {17}
Яроша {3}
Весела дача {16}
Весела {18}
Вечірній {3}
А теперь к каждому дому нужно в виде массива выбрать квартиры "flat" (там где "0" - частный сектор, там где много - гос сектор, или у частного дома несколько квартир):
Javascript
1
2
3
4
5
Литовська {17 {0}}
Яроша {3 {0}}
Весела дача {16 {0}}
Весела {18 {0}}
Вечірній {3 {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,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153}}

Инструмент
безусловно крут, но я думаю что в данной задаче мало чем сможет помочь(
0
Эксперт .NET
5531 / 4296 / 1216
Регистрация: 12.10.2013
Сообщений: 12,329
Записей в блоге: 2
31.08.2017, 20:46 4
Цитата Сообщение от lFreeManl Посмотреть сообщение
я думаю что в данной задаче мало чем сможет помочь
Думаю да, но не совсем.
Как я понял вашу задачу, вам нужно что-то вроде своего парсера-группировщика Json в какой-то ваш тип.
Тогда я бы предложил такой путь-сначала преобразовать ваш Json к тому типу (или массиву типов), что нам выдал инструмент (как-никак, строгая типизация даст нам массу преимуществ, та же возможность использовать LINQ и прочее), ну а потом уже как-то группировать и преобразовывать массив объектов, полученных из Json во что-то другое.
0
Эксперт .NET
5531 / 4296 / 1216
Регистрация: 12.10.2013
Сообщений: 12,329
Записей в блоге: 2
31.08.2017, 21:26 5
Лучший ответ Сообщение было отмечено lFreeManl как решение

Решение

lFreeManl, типа того что на скрине должен быть результат? Если так, код примера ниже.
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
70
71
72
73
74
75
76
77
78
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Json;
 
namespace JsonGrouping {
    class Program {
        static void Main(string[] args) {
            JsonObject[] jsonObjects = null;
            using (Stream fs = File.OpenRead("test.json")) {
                DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(JsonObject[]));
                jsonObjects = (JsonObject[])serializer.ReadObject(fs);
            }
 
            List<AddressObject> addresses = new List<AddressObject>();
 
            foreach (var group in jsonObjects.GroupBy(o => o.Street)) {
                AddressObject address = new AddressObject(group.Key);
                List<string> houses = new List<string>();
                List<string> flats = new List<string>();
                foreach (var obj in group) {
                    if (!houses.Contains(obj.House)) {
                        houses.Add(obj.House);
                    }
 
                    if (!flats.Contains(obj.Flat)) {
                        flats.Add(obj.Flat);
                    }
                }
                address.Houses = houses;
                address.Flats = flats;
                addresses.Add(address);
            }
 
            foreach (var address in addresses) {
                Console.WriteLine(address);
            }
            Console.ReadLine();
        }
    }
    [DataContract]
    public class JsonObject {
        [DataMember(Name = "watcher_name")]
        public string Name { get; set; }
        [DataMember(Name = "date")]
        public string Date { get; set; }
        [DataMember(Name = "street")]
        public string Street { get; set; }
        [DataMember(Name = "house")]
        public string House { get; set; }
        [DataMember(Name = "flat")]
        public string Flat { get; set; }
    }
    public class AddressObject {
        public AddressObject(string street) {
            Street = street;
        }
        public string Street { get; set; }
        public List<string> Houses { get; set; }
        public List<string> Flats { get; set; }
        public override string ToString() {
            StringBuilder sb = new StringBuilder();
            sb.AppendLine(Street);
            foreach (var house in Houses) {
                sb.AppendFormat("{0} ", house);
            }
            sb.AppendLine();
            foreach (var flat in Flats) {
                sb.AppendFormat("{0} ", flat);
            }
            sb.AppendLine();
            return sb.ToString();
        }
    }
}
Миниатюры
Вложенность типов адресса: улица, дом, квартира  
1
Эксперт .NET
5531 / 4296 / 1216
Регистрация: 12.10.2013
Сообщений: 12,329
Записей в блоге: 2
31.08.2017, 21:28 6
При желании можете создать по своему типу для домов и квартир, тут ничего сложного не будет. Просто немного скорректируете код и все.
0
10 / 10 / 1
Регистрация: 27.11.2011
Сообщений: 153
31.08.2017, 21:34  [ТС] 7
insite2012, щас затестю
Миниатюры
Вложенность типов адресса: улица, дом, квартира  
0
Эксперт .NET
5531 / 4296 / 1216
Регистрация: 12.10.2013
Сообщений: 12,329
Записей в блоге: 2
31.08.2017, 21:36 8
Цитата Сообщение от lFreeManl Посмотреть сообщение
щас затестю
Думаю все должно сработать, я ведь делал именно по тому Json-у, что вы привели в качестве примера.
0
10 / 10 / 1
Регистрация: 27.11.2011
Сообщений: 153
31.08.2017, 21:57  [ТС] 9
Цитата Сообщение от insite2012 Посмотреть сообщение
Думаю все должно сработать, я ведь делал именно по тому Json-у, что вы привели в качестве примера.
Именно, поэтому я докинул в базу новые адреса, дома, квартиры и все действительно работает *тьфу-тьфу-тьфу*) Большое спасибо!)
0
31.08.2017, 21:57
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
31.08.2017, 21:57
Помогаю со студенческими работами здесь

Запрос с параметрами Улица, Дом, Квартира, Жители
Добрый день! Сейчас делаю запрос с параметрами: Улица, Дом, Квартира, Жители. Надо, когда...

Выбор данных в связанных списках Улица, Дом, Квартира
Всем привет! Помогите, пожалуйста, реализовать выборку данных. На форме Выборка с полями...

Опишите, используя структуру записи, данные о студентах (фамилия, улица, дом, квартира)
Помогите составить программу: Опишите, используя структуру записи, данные о студентах (фамилия,...

Описать, используя структуру, почтовую сортировку (город, улица, дом, квартира, кому, ценность)
Описать, используя структуру, почтовую сортировку (город, улица, дом, квартира, кому, ценность)....


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru