Swift JSON строка в словаре не в состоянии проанализировать все значения - PullRequest
0 голосов
/ 10 апреля 2020

Я загружаю файл JSON из своей базы данных, который возвращает следующую строку:

["ingredients": asdasdasd, 
"price": 14, 
"_id": 
    {
     "$oid" = 5e8e3706f00ca80f251485c3;
    }, 
"category": sadad,
 "available": Disponibile,
 "name": asdadasd]

Затем я преобразую эту строку в данные, чтобы затем преобразовать ее в Dictionary<String, Any>

   if let myData = responseString.data(using: .utf8) {
        do {
            let myArray = try (JSONSerialization.jsonObject(with: myData) as? [Dictionary<String, Any>])!
            completion(myArray, nil)
        } catch let error as NSError {
            print("error:" + String(describing: error))
            completion(nil, error)
        }
    }

Это прекрасно работает, так как я могу получить, скажем, параметр цены, выполняющий myArray["price"].

Проблема возникает, когда я пытаюсь получить параметр Id, например, когда я myArray["_id"] I get:

{
    "$oid" = 5e8e370af00ca80f251485cf;
}

Я бы хотел получить параметр ID напрямую, и я не могу разобрать это значение в JSON, поскольку оно не в формате JSON. В настоящий момент я исправляю проблему, манипулируя этой строкой, заменяя = на :, удаляя ; и другие неприятные вещи, но я уверен, что есть более эффективный способ решения проблемы.

Ответы [ 2 ]

0 голосов
/ 10 апреля 2020

То, что вы опубликовали, выглядит как вывод на печать отладчиком, а не JSON с вашего сервера. Я собираюсь предположить, что ваш JSON на самом деле выглядит так:

[ 
  {
    "ingredients": "asdasdasd", 
     "price": 14, 
     "_id": {
       "$oid": "5e8e3706f00ca80f251485c3"
      }, 
     "category": "sadad",
     "available": "Disponibile",
     "name": "asdadasd"
  } 
]

Учитывая это, вы можете использовать структуру модели, такую ​​как

struct Recipe: Codable {
    let ingredients: String
    let price: Int
    let id: ID
    let category, available, name: String

    enum CodingKeys: String, CodingKey {
        case ingredients, price
        case id = "_id"
        case category, available, name
    }
}

struct ID: Codable {
    let oid: String

    enum CodingKeys: String, CodingKey {
        case oid = "$oid"
    }
}

typealias Recipes = [Recipe]

чтобы проанализировать его, используя

do {
   let recipes = try JSONDecoder(Recipes.self, from: myData)

   let firstOid = recipe.first?.id.oid
} catch {
   print(error)
}

Тем не менее, я бы рекомендовал избегать обобщенных c имен, таких как myArray для ваших переменных.

Кроме того, при получении данных JSON с вашего сервера нет необходимости сначала преобразовывать их в String, а затем обратно в Data, а затем передавать его анализатору JSON - просто передайте необработанные данные сервера.

0 голосов
/ 10 апреля 2020

myArray ["_ id"] - это словарь в вашем myArray. Поэтому вам нужно преобразовать myArray ["_ id"] в словарь, а затем получить доступ к идентификатору. попробуйте это

let id =  (myArray["_id"] as Dictionary ?? [:])["$oid"] as? String ?? ""
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...