0

I have the following Json response.

{
  "language": "en",
  "textAngle": 0,
  "orientation": "Up",
  "regions": [
    {
      "boundingBox": "96,29,244,474",
      "lines": [
        {
          "boundingBox": "96,29,58,12",
          "words": [
            {
              "boundingBox": "96,29,58,12",
              "text": "SG4207"
            }
          ]
        },
        {
          "boundingBox": "97,64,159,16",
          "words": [
            {
              "boundingBox": "97,65,27,15",
              "text": "Eng"
            },
            {
              "boundingBox": "129,64,34,16",
              "text": "Lieh,"
            },
            {
              "boundingBox": "168,65,37,12",
              "text": "Yuen"
            },
            {
              "boundingBox": "212,65,44,15",
              "text": "Kwan,"
            }
          ]
        },
        {
          "boundingBox": "97,99,243,16",
          "words": [
            {
              "boundingBox": "97,99,52,13",
              "text": "Mobile"
            },
            {
              "boundingBox": "154,99,64,13",
              "text": "Wireless"
            },
            {
              "boundingBox": "223,99,62,13",
              "text": "Solution"
            },
            {
              "boundingBox": "291,99,49,16",
              "text": "Design"
            }
          ]
        },
        {
          "boundingBox": "97,134,117,16",
          "words": [
            {
              "boundingBox": "97,134,44,16",
              "text": "Darryl"
            },
            {
              "boundingBox": "147,134,27,13",
              "text": "and"
            },
            {
              "boundingBox": "179,134,35,16",
              "text": "Ajith"
            }
          ]
        },
        {
          "boundingBox": "96,169,71,16",
          "words": [
            {
              "boundingBox": "96,169,71,16",
              "text": "Weekday"
            }
          ]
        },
        {
          "boundingBox": "97,205,72,16",
          "words": [
            {
              "boundingBox": "97,205,72,16",
              "text": "(Monday)"
            }
          ]
        },
        {
          "boundingBox": "96,241,80,15",
          "words": [
            {
              "boundingBox": "96,244,32,12",
              "text": "gam"
            },
            {
              "boundingBox": "133,248,5,1",
              "text": "-"
            },
            {
              "boundingBox": "143,241,33,15",
              "text": "5pm"
            }
          ]
        },
        {
          "boundingBox": "96,275,72,13",
          "words": [
            {
              "boundingBox": "96,275,72,13",
              "text": "Weekend"
            }
          ]
        },
        {
          "boundingBox": "97,310,77,16",
          "words": [
            {
              "boundingBox": "97,310,77,16",
              "text": "(Saturday)"
            }
          ]
        },
        {
          "boundingBox": "96,347,80,15",
          "words": [
            {
              "boundingBox": "96,350,32,12",
              "text": "gam"
            },
            {
              "boundingBox": "133,354,5,1",
              "text": "-"
            },
            {
              "boundingBox": "143,347,33,15",
              "text": "5pm"
            }
          ]
        },
        {
          "boundingBox": "97,382,41,15",
          "words": [
            {
              "boundingBox": "97,382,41,15",
              "text": "3-Apr"
            }
          ]
        },
        {
          "boundingBox": "97,417,45,15",
          "words": [
            {
              "boundingBox": "97,417,8,12",
              "text": "1"
            },
            {
              "boundingBox": "115,417,27,15",
              "text": "Apr"
            }
          ]
        },
        {
          "boundingBox": "97,452,48,15",
          "words": [
            {
              "boundingBox": "97,452,48,15",
              "text": "ID-Apr"
            }
          ]
        },
        {
          "boundingBox": "96,488,42,15",
          "words": [
            {
              "boundingBox": "96,488,42,15",
              "text": "8-Apr"
            }
          ]
        }
      ]
    }
  ]
}

Need to create a String array from the above json in Swift3. Tried the following

if dictionary["regions"] != nil {

    // Get Regions from the dictionary
    let regions = (dictionary["regions"] as! NSArray).firstObject as? [String:AnyObject]

    // Get lines from the regions dictionary
    let lines = regions!["lines"] as! NSArray


    // Get words from lines
    let inLine = lines.enumerated().map {($0.element as? NSDictionary)?["words"] as! [[String : AnyObject]] }

    // Get text from words
    let extractedText = inLine.enumerated().map { $0.element[0]["text"] as! String}
    return extractedText
} else {
        return [""];
    }

But did not get the actual String.

1
  • 1
    Why are you using NSArray and NSDictionary in Swift 3? Use Swift arrays and dictionaries. Commented May 7, 2017 at 15:06

1 Answer 1

1

You just need to cast to the correct types, your code is almost correct. I created this code in a playground and I can get all of the values.

let jsonString = "{\"language\":\"en\",\"textAngle\":0,\"orientation\":\"Up\",\"regions\":[{\"boundingBox\":\"96,29,244,474\",\"lines\":[{\"boundingBox\":\"96,29,58,12\",\"words\":[{\"boundingBox\":\"96,29,58,12\",\"text\":\"SG4207\"}]},{\"boundingBox\":\"97,64,159,16\",\"words\":[{\"boundingBox\":\"97,65,27,15\",\"text\":\"Eng\"},{\"boundingBox\":\"129,64,34,16\",\"text\":\"Lieh,\"},{\"boundingBox\":\"168,65,37,12\",\"text\":\"Yuen\"},{\"boundingBox\":\"212,65,44,15\",\"text\":\"Kwan,\"}]},{\"boundingBox\":\"97,99,243,16\",\"words\":[{\"boundingBox\":\"97,99,52,13\",\"text\":\"Mobile\"},{\"boundingBox\":\"154,99,64,13\",\"text\":\"Wireless\"},{\"boundingBox\":\"223,99,62,13\",\"text\":\"Solution\"},{\"boundingBox\":\"291,99,49,16\",\"text\":\"Design\"}]},{\"boundingBox\":\"97,134,117,16\",\"words\":[{\"boundingBox\":\"97,134,44,16\",\"text\":\"Darryl\"},{\"boundingBox\":\"147,134,27,13\",\"text\":\"and\"},{\"boundingBox\":\"179,134,35,16\",\"text\":\"Ajith\"}]},{\"boundingBox\":\"96,169,71,16\",\"words\":[{\"boundingBox\":\"96,169,71,16\",\"text\":\"Weekday\"}]},{\"boundingBox\":\"97,205,72,16\",\"words\":[{\"boundingBox\":\"97,205,72,16\",\"text\":\"(Monday)\"}]},{\"boundingBox\":\"96,241,80,15\",\"words\":[{\"boundingBox\":\"96,244,32,12\",\"text\":\"gam\"},{\"boundingBox\":\"133,248,5,1\",\"text\":\"-\"},{\"boundingBox\":\"143,241,33,15\",\"text\":\"5pm\"}]},{\"boundingBox\":\"96,275,72,13\",\"words\":[{\"boundingBox\":\"96,275,72,13\",\"text\":\"Weekend\"}]},{\"boundingBox\":\"97,310,77,16\",\"words\":[{\"boundingBox\":\"97,310,77,16\",\"text\":\"(Saturday)\"}]},{\"boundingBox\":\"96,347,80,15\",\"words\":[{\"boundingBox\":\"96,350,32,12\",\"text\":\"gam\"},{\"boundingBox\":\"133,354,5,1\",\"text\":\"-\"},{\"boundingBox\":\"143,347,33,15\",\"text\":\"5pm\"}]},{\"boundingBox\":\"97,382,41,15\",\"words\":[{\"boundingBox\":\"97,382,41,15\",\"text\":\"3-Apr\"}]},{\"boundingBox\":\"97,417,45,15\",\"words\":[{\"boundingBox\":\"97,417,8,12\",\"text\":\"1\"},{\"boundingBox\":\"115,417,27,15\",\"text\":\"Apr\"}]},{\"boundingBox\":\"97,452,48,15\",\"words\":[{\"boundingBox\":\"97,452,48,15\",\"text\":\"ID-Apr\"}]},{\"boundingBox\":\"96,488,42,15\",\"words\":[{\"boundingBox\":\"96,488,42,15\",\"text\":\"8-Apr\"}]}]}]}"

if let jsonDict = (try? JSONSerialization.jsonObject(with: Data(jsonString.utf8))) as? [String: Any] {
    if let regions = jsonDict["regions"] as? [[String: Any]] {
        for region in regions {
            if let lines = region["lines"] as? [[String: Any]] {
                for line in lines {
                    if let words = line["words"] as? [[String: Any]] {
                        for word in words {
                            if let text = word["text"] {
                                print(text)
                            }
                        }
                    }
                }
            }
        }
    }
}

Output:

Weekday
(Monday)
gam
-
5pm
Weekend
(Saturday)
gam
-
5pm
3-Apr
1
Apr
ID-Apr
8-Apr

Obviously there's alot of nesting here, you could tidy it up and shorten it using functions such as map, but this exercise was more to show you the casting that you need for each level.

Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.