Доступ к вложенному объекту JSON [String: Any] и добавление к нему - PullRequest
0 голосов
/ 08 февраля 2019

Используя swift, я пытаюсь получить доступ к объекту "location" в части "locationConstraint" JSON, которая выглядит следующим образом:

        let jsonObj : [String: Any] =
            [
                "attendees": [
                    [
                        "type": "required",
                        "emailAddress": [
                            "name": nameOfRoom,
                            "address": roomEmailAddress
                        ]
                    ]
                ],
                "locationConstraint": [
                    "isRequired": "true",
                    "suggestLocation": "false",
                    "locations": [
                        [
                            "displayName": "First Floor Test Meeting Room 1",
                            "locationEmailAddress": "FirstFloorTestMeetingRoom1@onmicrosoft.com"
                        ],
                        [
                            "displayName": "Ground Floor Test Meeting Room 1",
                            "locationEmailAddress": "GroundFloorTestMeetingRoom1@onmicrosoft.com"
                        ]
                        //and the rest of the rooms below this.. 
                    ]
                ],
                "meetingDuration": durationOfMeeting,
        ]

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

Мой метод сделать это:

static func setupJsonObjectForFindMeetingTimeAllRoomsTest(nameOfRoom: String, roomEmailAddress: String, dateStartString: String, dateEndString: String, durationOfMeeting: String, locations: [String]) -> [String: Any] {
    let jsonObj : [String: Any] =
        [
            "attendees": [
                [
                    "type": "required",
                    "emailAddress": [
                        "name": nameOfRoom,
                        "address": roomEmailAddress
                    ]
                ]
            ],
            "meetingDuration": durationOfMeeting
    ]

    let jsonObject = addLocationsToExistingJson(locations:locations, jsonObj: jsonObj)
    return jsonObject
}

и мой метод добавления местоположений в существующий объект json:

static func addLocationsToExistingJson(locations: [String], jsonObj: [String: Any]) -> [String: Any] {
    var  data: [String: Any] = jsonObj

    let locConstraintObj = [
            "isRequired": "true",
            "suggestLocation": "false",
            "locations" : []

        ] as [String : Any]

    //try access locationConstraint part of json
    data["locationConstraint"] = locConstraintObj

    for i in stride(from: 0, to: locations.count, by: 1) {
        let item: [String: Any] =  [
            "displayName": locations[i],
            "locationEmailAddress": locations[i]
        ]

        // get existing items, or create new array if doesn't exist
        //this line below wrong? I need to access data["locationConstraint]["locations"]
        //but an error occurs when i change to the above.. .how do i access it?
        var existingItems = data["locations"] as? [[String: Any]] ?? [[String: Any]]()

        // append the item
        existingItems.append(item)

        // replace back into `data`
       data["locations"] = existingItems
    }
    return data
}

Итак, в конечном итоге мой последний работающий объект json должен выглядеть следующим образом:

["meetingDuration": "PT60M", "returnSuggestionReasons": "true", "посетители": [["emailAddress": ["address": "TestUser6@qubbook.onmicrosoft.com", "name": "N"], "type": "required"]] ,imumAttendeePercentage: "100", "locationConstraint": ["location": [["displayName": "Комната для проведения тестов первого этажа 1", "locationEmailAddress": "FirstFloorTestMeetingRoom1@qubbook.onmicrosoft.com "], [" displayName ":" Тест первого этажаt Конференц-зал 1 "," locationEmailAddress ":" GroundFloorTestMeetingRoom1@qubbook.onmicrosoft.com "]]," offerLocation ":" false "," isRequired ":" true "]," timeConstraint ": [" activityDomain ":" неограниченно"," timeslots ": [[" start ": [" dateTime ":" 2019-02-07 14:30:00 "," timeZone ":" UTC "]," end ": [" dateTime ":" 2019-02-07 15:30:00 "," timeZone ":" UTC "]]]]," isOrganizerOptional ":" true "]

Где это выглядит так:

["timeConstraint": ["activityDomain": "неограниченно", "временные интервалы": [["start": ["dateTime": "2019-02-08 08:30:00", "timeZone"":" UTC "]," end ": [" dateTime ":" 2019-02-08 09:30:00 "," timeZone ":" UTC "]]]]," locationConstraint ": [" offerLocation ":"false", "location": [], "isRequired": "true"], "чел.": [["emailAddress": ["address": "TestUser6@qubbook.onmicrosoft.com", "name": "N "]," type ":" required "]]," returnSuggestionReasons ":" true "," isOrganizerOptional ":" true "," minimalAttendeePercentage ":" 100 "," location ": [[" locationEmailAddress ":" FirstFloorTestMeetingRoom1@qubbook.onmicrosoft.com "," displayName ":" FirstFloorTestMeetingRoom1@qubbook.onmicrosoft.com "], [" locationEmailAddress ":" GroundFloorTestMeetingRoom1@qubbook.estmicrosoft.com "," GroundName ":"com "]]," meetingDuration ":" PT60M "]

Где объект местоположений добавляется вне части locationConstraint в JSON. Я знаю, что мне нужен доступ к части locationConstraint моегоjson вот так: var existingItems = data["locationConstraint"]!["locations"] as? [[String: Any]] ?? [[String: Any]]() но это возвращает ошибку:

Тип "Любой" не имеет подписных элементов

Я впервые работаю с JSON и пытаюсьманипулировать ими в кратчайшие сроки. Как бы я исправить это?

1 Ответ

0 голосов
/ 08 февраля 2019

Решение с использованием объектов модели и Codable

, как предлагает троянское приложение, вы должны использовать объекты модели и манипулировать ими напрямую.

import Foundation

struct Meeting: Codable {
    var attendees: [Attendee]
    var locationConstraint: LocationConstraint
    var meetingDuration: Int
}

struct Attendee: Codable {
    var type: Type
    var emailAddress: EmailAdress

    enum `Type`: String, Codable {
        case required
    }
}

struct LocationConstraint: Codable {
    var isRequired: Bool
    var suggestLocation: Bool
    var locations: [Location]
}

struct EmailAdress: Codable {
    var name: String
    var address: String
}

struct Location: Codable {
    var displayName: String
    var locationEmailAddress: String
}

Сначала мы берем ваш словарь ...

let jsonDict: [String: Any] =
    [
        "attendees": [
            [
                "type": "required",
                "emailAddress": [
                    "name": "specificName",
                    "address": "specificAdress"
                ]
            ]
        ],
        "locationConstraint": [
            "isRequired": true,
            "suggestLocation": false,
            "locations": [
                [
                    "displayName": "First Floor Test Meeting Room 1",
                    "locationEmailAddress": "FirstFloorTestMeetingRoom1@onmicrosoft.com"
                ],
                [
                    "displayName": "Ground Floor Test Meeting Room 1",
                    "locationEmailAddress": "GroundFloorTestMeetingRoom1@onmicrosoft.com"
                ]
            ]
        ],
        "meetingDuration": 1800,
]

... и сериализуем его.

let jsonData = try JSONSerialization.data(withJSONObject: jsonDict, options: .prettyPrinted)
print(String(data: jsonData, encoding: String.Encoding.utf8))

Затем мы декодируем его в нашу встречумодель.

var meeting = try JSONDecoder().decode(Meeting.self, from: jsonData)

Мы инициализируем новое местоположение и добавляем его в наш массив meeting.locationConstraints.locations.

let newLocation = Location(displayName: "newDisplayName", locationEmailAddress: "newLocationEmailAdress")
meeting.locationConstraint.locations.append(newLocation)

И, наконец, снова перекодируем наш объект модели.

let updatedJsonData = try JSONEncoder().encode(meeting)
print(String(data: updatedJsonData, encoding: String.Encoding.utf8))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...