Как я могу заполнить часть объекта JSON без повторяющегося кода? - PullRequest
0 голосов
/ 07 февраля 2019

Я использую Microsoft Graph API, в частности API FindMeetingTimes.Что можно увидеть здесь: https://docs.microsoft.com/en-us/graph/api/user-findmeetingtimes?view=graph-rest-1.0

Я использую Swift для разработки этого.Мой JSON-объект работает, и публикация успешна, но мне просто интересно, каков будет лучший / наиболее эффективный способ изменить этот код, чтобы он вырезал повторяющийся код - в частности, добавление местоположений в JSON.Список местоположений может быть очень большим, поэтому я хотел бы перебрать массив местоположений и добавить их в объект JSON.

Мой метод выглядит следующим образом:

static func setupJsonObjectForFindMeetingTimeAllRooms(nameOfRoom: String, roomEmailAddress: String, dateStartString: String, dateEndString: String, durationOfMeeting: String) -> [String: Any] {
    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@microsoft.com"
                    ],
                    [
                        "displayName": "Ground Floor Test Meeting Room 1",
                        "locationEmailAddress": "GroundFloorTestMeetingRoom1@microsoft.com"
                    ]
                    //and the rest of the rooms below this.. how do i do this outside in a loop? to prevent repetitive code?
                ]
            ],
            "timeConstraint": [
                "activityDomain":"unrestricted",
                "timeslots": [
                    [
                        "start": [
                            "dateTime": dateStartString,
                            "timeZone": Resources.utcString
                        ],
                        "end": [
                            "dateTime": dateEndString,
                            "timeZone": Resources.utcString
                        ]
                    ]
                ]
            ],
            "meetingDuration": durationOfMeeting,
            "returnSuggestionReasons": "true",
            "minimumAttendeePercentage": "100",
            "isOrganizerOptional": "true"
    ]
    return jsonObj
}

Что такоелучший способ сделать это?Могу ли я просто удалить часть местоположений в JSON и, прежде чем вернуться, заполнить ее массивом местоположений?

Я пытался реализовать метод добавления местоположений в JSON - используя этот метод:

static func addLocationsToExistingJson(locations: [String], jsonObj: [String: Any]) -> [String: Any] {
        var  data: [String: Any] = jsonObj
        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
            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 в исходном методе. Но кажется, что окончательный формат JSON не тот формат, который мне нужен.Неправильная версия выглядит следующим образом:

["timeConstraint": ["activityDomain": "unrestricted", "timeslots": [["start": ["dateTime": "2019-02-07 14:00:00", "timeZone": "UTC"], "end": ["dateTime": "2019-02-07 15:00:00", "timeZone": "UTC"]]]], "minimumAttendeePercentage": "100", "isOrganizerOptional": "true", "returnSuggestionReasons": "true", "meetingDuration": "PT60M", "attendees": [["type": "required", "emailAddress": ["name": "N", "address": "TestUser6@qubbook.onmicrosoft.com"]]], "locationConstraint": ["isRequired": "true", "suggestLocation": "false"]]

В то время как рабочий JSON выглядит следующим образом:

["timeConstraint": ["activityDomain": "unrestricted", "timeslots": [["start": ["dateTime": "2019-02-07 14:30:00", "timeZone": "UTC"], "end": ["dateTime": "2019-02-07 15:30:00", "timeZone": "UTC"]]]], "attendees": [["type": "required", "emailAddress": ["name": "N", "address": "TestUser6@qubbook.onmicrosoft.com"]]], "minimumAttendeePercentage": "100", "locations": [["displayName": "FirstFloorTestMeetingRoom1@qubbook.onmicrosoft.com", "locationEmailAddress": "FirstFloorTestMeetingRoom1@qubbook.onmicrosoft.com"], ["displayName": "GroundFloorTestMeetingRoom1@qubbook.onmicrosoft.com", "locationEmailAddress": "GroundFloorTestMeetingRoom1@qubbook.onmicrosoft.com"]], "locationConstraint": ["isRequired": "true", "suggestLocation": "false"], "meetingDuration": "PT60M", "isOrganizerOptional": "true", "returnSuggestionReasons": "true"]

Как бы я изменил свой код, чтобы местоположения добавлялись под объектом locationConstraint в пределахJSON, а не просто JSON, а не часть ["locationConstraint"]?

1 Ответ

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

Как и предполагал Йоаким , вы можете смоделировать структуру json с помощью структур и Codable.Например:


    struct AdditionalData: Codable {
        let emailAdress: [String]
    }

    struct Person: Codable {
        let age: Int
        let name: String
        let additionalData: AdditionalData
    }

    let additionalData = AdditionalData(emailAdress: ["test@me.com", "foo@bar.com"])
    let p1 = Person(age: 30,
                    name: "Frank",
                    additionalData: additionalData)

    let encoder = JSONEncoder()
    encoder.outputFormatting = .prettyPrinted

    if let data = try? encoder.encode(p1),
        let jsonString = String(data: data, encoding: .utf8) {
        print(jsonString)
    }

Что приводит к:

{
  "age" : 30,
  "name" : "Frank",
  "additionalData" : {
    "emailAdress" : [
      "test@me.com",
      "foo@bar.com"
    ]
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...