[英]IOS/Swift/SwiftyJSON: Parse Nested JSON from IBM Watson/Bluemix API
我正在从IBM Watson的音频分析器API接收一些JSON,其格式如下所示。 我想做的是在对象中捕获JSON,并带有主要音调的属性和值。 愤怒:.218厌恶:2.20,等等。 当我分析更多文本时,我想将它们添加到这些对象的数组中。
在这个阶段,我只想使用SwiftyJSON对api进行一些操作,但是语法上却很困惑:
以下代码仅显示为nil:
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";
}
);
}
);
};
}
您可以使用swift 4和URLSession
Codable
结构快速轻松地完成此URLSession
。
这是您问题的快速解决方案。 struct属性映射到您的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()
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.