IOS / Swift / SwiftyJSON: анализ вложенного JSON из API IBM Watson / Bluemix - PullRequest
0 голосов
/ 31 мая 2018

Я получаю JSON от API тонального анализатора IBM Watson в формате, показанном ниже для фрагмента текста.То, что я хотел бы сделать, это захватить JSON в объект со свойством и значением для основных тонов, например.гнев: 218 отвращение: 2,20 и т. д. для каждого анализируемого раздела текста.Когда я анализирую больше фрагментов текста, я хочу добавить их в массив этих объектов.

На данном этапе я просто хочу сделать что-то с API, используя SwiftyJSON, но меня смущает синтаксис:

Следующий код, просто печатается как ноль:

 let anger = JSON(value)["results"][0]["anger"].array?.map { json in
                    json["anger"].stringValue
                                    }
                print (anger)

Буду признателен за рекомендации о том, как на самом деле захватить тоны и их значения .... Заранее спасибо за любые предложения.

JSON выглядит так:

 {
        "document_tone" =     {
            "tone_categories" =         (
                            {
                    "category_id" = "emotion_tone";
                    "category_name" = "Emotion Tone";
                    tones =                 (
                                            {
                            score = "0.218727";
                            "tone_id" = anger;
                            "tone_name" = Anger;
                        },
                                            {
                            score = "0.210102";
                            "tone_id" = disgust;
                            "tone_name" = Disgust;
                        },
                                            {
                            score = "0.060026";
                            "tone_id" = fear;
                            "tone_name" = Fear;
                        },
                                            {
                            score = "0.076444";
                            "tone_id" = joy;
                            "tone_name" = Joy;
                        },
                                            {
                            score = "0.176849";
                            "tone_id" = sadness;
                            "tone_name" = Sadness;
                        }
                    );
                },
                            {
                    "category_id" = "language_tone";
                    "category_name" = "Language Tone";
                    tones =                 (
                                            {
                            score = 0;
                            "tone_id" = analytical;
                            "tone_name" = Analytical;
                        },
                                            {
                            score = 0;
                            "tone_id" = confident;
                            "tone_name" = Confident;
                        },
                                            {
                            score = 0;
                            "tone_id" = tentative;
                            "tone_name" = Tentative;
                        }
                    );
                },
                            {
                    "category_id" = "social_tone";
                    "category_name" = "Social Tone";
                    tones =                 (
                                            {
                            score = "0.02278";
                            "tone_id" = "openness_big5";
                            "tone_name" = Openness;
                        },
                                            {
                            score = "0.340597";
                            "tone_id" = "conscientiousness_big5";
                            "tone_name" = Conscientiousness;
                        },
                                            {
                            score = "0.541852";
                            "tone_id" = "extraversion_big5";
                            "tone_name" = Extraversion;
                        },
                                            {
                            score = "0.545246";
                            "tone_id" = "agreeableness_big5";
                            "tone_name" = Agreeableness;
                        },
                                            {
                            score = "0.743194";
                            "tone_id" = "emotional_range_big5";
                            "tone_name" = "Emotional Range";
                        }
                    );
                }
            );
        };
    }

1 Ответ

0 голосов
/ 07 июня 2018

Вы можете быстро и легко сделать это с помощью Codable структур в swift 4 и URLSession.

Вот быстрое решение вашей проблемы.Свойства структуры отображаются на ваше дерево json, и вам может потребоваться изменить структуры, чтобы они соответствовали полученному json.JSON, который вы разместили выше, имеет недопустимый формат, иначе я мог бы правильно отобразить его.

struct Tone: Codable {
    let score: Double
    let tone_id: String
    let tone_name: String
}

struct Category: Codable {
    let category_id: String
    let category_name: String
    let tones: [Tone]
}

struct DocumentTone: Codable {
    let toneCategories: [Category]
}

final class ToneService {
    static func fetchTone(toneUrl: URL, _ completion: @escaping([DocumentTone]) -> Void) {
        URLSession.shared.dataTask(with: toneUrl) { (data, response, error) in
            guard let data = data else { return }
            do {
                let decoder = JSONDecoder()
                // If your json returns a single object, use DocumentTone.self instead of [DocumentTone].self, as well change the completion
                let tone = try decoder.decode([DocumentTone].self, from: data)
                completion(tone)
            } catch let error {
                print(error.localizedDescription)
            }
        }.resume()
    }
}
...