Bartłomiej Semańczyk
Bartłomiej Semańczyk

Reputation: 61774

Unescaped control character around character 1833

I have a String:

Optional("[{\"notes\":[],\"name\":\"1\",\"status\":1,\"identifier\":\"82AF8894-8C8B-4EEE-B185-11798769BBEF\"},{\"notes\":[],\"name\":\"2\",\"status\":1,\"identifier\":\"390F19DF-9DA3-45F0-AAA5-D890B618B2F9\"},{\"notes\":[],\"name\":\"3\",\"status\":1,\"identifier\":\"9B08FC46-B463-4DC7-B5E6-2E48982C3F2C\"},{\"notes\":[],\"name\":\"4\",\"status\":1,\"identifier\":\"660E2206-DFFD-4997-8A2E-39ADEB46C4E3\"},{\"notes\":[],\"name\":\"5\",\"status\":1,\"identifier\":\"47F997CD-0C1C-4CFE-8DEB-A7787DD863DC\"},{\"notes\":[],\"name\":\"6\",\"status\":2,\"identifier\":\"6AA378A4-5C36-48C2-92B1-C48F4DB109AF\"},{\"notes\":[],\"name\":\"7\",\"status\":1,\"identifier\":\"40E0178A-67D8-4A3B-88CC-680C96AAB656\"},{\"notes\":[],\"name\":\"8\",\"status\":2,\"identifier\":\"B6329CF3-C047-4606-A868-1F85E214393C\"},{\"notes\":[],\"name\":\"9\",\"status\":1,\"identifier\":\"876BD7BE-CAC2-414C-B697-49B90A90419B\"},{\"notes\":[],\"name\":\"10\",\"status\":2,\"identifier\":\"CDCD0612-450A-4CDD-AA42-219ADFC9E070\"},{\"notes\":[],\"name\":\"11\",\"status\":2,\"identifier\":\"789CD52E-4B48-4562-9590-A00DA198D1B8\"},{\"notes\":[],\"name\":\"12\",\"status\":1,\"identifier\":\"84B901E6-0C37-4DA5-9430-69617CC62738\"},{\"notes\":[],\"name\":\"13\",\"status\":2,\"identifier\":\"E4C6D04C-D02C-4F57-AE80-641178EB7798\"},{\"notes\":[],\"name\":\"14\",\"status\":1,\"identifier\":\"A6CD59D4-4EC0-405C-8D10-DB811CD07000\"},{\"notes\":[],\"name\":\"15\",\"status\":2,\"identifier\":\"537E9463-1A46-422E-9FA3-8A7A42078B60\"},{\"notes\":[],\"name\":\"16\",\"status\":2,\"identifier\":\"8DD2BFAA-D2C0-4D66-AB3D-7E2E7856F01D\"},{\"notes\":[{\"date\":\"2017-03-28T00:00:00.000+0200\",\"text\":\"byl ale mial gosci i poprosil zeby przyjsc jutro. Byl grzeczny i kulturalny🙃\",\"identifier\":\"3ADE4B68-1932-4563-A9AC-846109ADBB84\"},{\"date\":\"2017-03-15T00:00:00.000+0100\",\"text\":\"Pozne popoludnie... Pan Jedrek, operuje serce, jest chirurgiem, kardiochirurgiem... Byl zmecxony bo wlasnie skonczyl operacje serca;) Powiedzial tez ze nie chce aaaaaaa...bo jest Aaaaaaaaaaaa🙃\n\nWyrazil zgode zeby za conajmniej 8-9 dni wrocic🙃\",\"identifier\":\"03F16207-D9E4-4C46-A736-9F4B3CE9181A\"}],\"name\":\"17\",\"status\":3,\"identifier\":\"906CEFDA-C32E-4DB6-96FE-BFF21083C4C9\"},{\"notes\":[],\"name\":\"18\",\"status\":1,\"identifier\":\"9BE0EBA7-B87A-4D2E-AC70-278A88D59617\"},{\"notes\":[],\"name\":\"19\",\"status\":2,\"identifier\":\"46A993B8-664F-4222-ABA2-8360043A312A\"},{\"notes\":[],\"name\":\"20\",\"status\":2,\"identifier\":\"A5D00809-AA95-4C78-8A2C-0A42D79B1FA3\"},{\"notes\":[],\"name\":\"21\",\"status\":2,\"identifier\":\"F07E514C-663F-479B-B747-DF0F2B4ED211\"},{\"notes\":[],\"name\":\"22\",\"status\":2,\"identifier\":\"3ED807F2-04B3-4F1E-9F88-F2D65C0ADABA\"},{\"notes\":[],\"name\":\"23\",\"status\":2,\"identifier\":\"FAD09FDA-F7F6-49AE-B25D-3FDFFB0B2F6D\"},{\"notes\":[],\"name\":\"24\",\"status\":2,\"identifier\":\"41A482F5-5F7B-41F6-AD2E-BE061693E524\"},{\"notes\":[],\"name\":\"25\",\"status\":2,\"identifier\":\"8F567828-05CD-42CC-9F45-B045F2BF0F82\"},{\"notes\":[],\"name\":\"26\",\"status\":2,\"identifier\":\"93273621-FEE1-4C76-902E-91620234B1E3\"},{\"notes\":[],\"name\":\"27\",\"status\":2,\"identifier\":\"68B77921-F5A4-4A04-B2B7-6F73444E109B\"},{\"notes\":[],\"name\":\"28\",\"status\":1,\"identifier\":\"AC1EFC4F-C3E1-4CDB-AAE3-02FDCE707700\"},{\"notes\":[],\"name\":\"29\",\"status\":1,\"identifier\":\"5E53DA7C-A79F-4987-B8CF-1E2BA1E156FE\"},{\"notes\":[],\"name\":\"30\",\"status\":2,\"identifier\":\"A706E390-806C-4979-A528-8B4D732B4486\"},{\"notes\":[],\"name\":\"31\",\"status\":1,\"identifier\":\"18025E7A-FF58-475B-B613-147D184DE48F\"},{\"notes\":[],\"name\":\"32\",\"status\":1,\"identifier\":\"7E4670AA-1A6E-46BD-9D3F-86F0952CC698\"},{\"notes\":[],\"name\":\"33\",\"status\":1,\"identifier\":\"A6047C98-A871-455E-B2B2-109BD671071E\"},{\"notes\":[],\"name\":\"34\",\"status\":1,\"identifier\":\"696F6E18-663C-4EDF-BA23-E203A771D875\"},{\"notes\":[],\"name\":\"35\",\"status\":1,\"identifier\":\"5324F03C-CFAF-4434-ADFF-98A9809AD655\"},{\"notes\":[],\"name\":\"36\",\"status\":1,\"identifier\":\"65F815F3-CEA8-449F-8C34-742B747617F4\"},{\"notes\":[],\"name\":\"37\",\"status\":1,\"identifier\":\"A0B24629-6FFB-44ED-9A4C-829F603C10E3\"},{\"notes\":[],\"name\":\"38\",\"status\":1,\"identifier\":\"8175F5F8-064A-4228-AA7A-CA5BE6E21FCC\"},{\"notes\":[],\"name\":\"39\",\"status\":2,\"identifier\":\"1E306E6B-38AB-40EC-B17F-81D83E455855\"},{\"notes\":[],\"name\":\"40\",\"status\":2,\"identifier\":\"DD881B40-F181-4515-81C6-F9DA2D46D1F4\"},{\"notes\":[{\"date\":\"2017-02-09T00:00:00.000+0100\",\"text\":\"jezyk rosyjski\",\"identifier\":\"D54DDEC9-D7AF-4F4A-9C24-CA799A9364CA\"}],\"name\":\"41\",\"status\":2,\"identifier\":\"52A9D272-E7A0-40D3-8CAF-867F3EF1C479\"},{\"notes\":[],\"name\":\"42\",\"status\":2,\"identifier\":\"9EF4FB3C-DE2A-45AE-AA84-C1411301F88F\"},{\"notes\":[],\"name\":\"43\",\"status\":1,\"identifier\":\"496F8BD8-666A-47CE-8489-A3352F3EE429\"},{\"notes\":[],\"name\":\"44\",\"status\":1,\"identifier\":\"C8AFD0ED-ECC2-4A4F-AC28-70BAD5E8E317\"},{\"notes\":[],\"name\":\"45\",\"status\":1,\"identifier\":\"4FB379F9-D20F-463E-B3B4-5543CB231478\"},{\"notes\":[],\"name\":\"46\",\"status\":1,\"identifier\":\"A0E4028C-ADC4-4373-AE04-5A12EE4EE9A0\"},{\"notes\":[],\"name\":\"47\",\"status\":2,\"identifier\":\"4DE26AAC-6420-4C1C-9624-969989A5D027\"},{\"notes\":[],\"name\":\"48\",\"status\":2,\"identifier\":\"138118B3-9D6B-4227-9EE3-869134A4A53C\"},{\"notes\":[],\"name\":\"49\",\"status\":2,\"identifier\":\"4AE34F98-6FD1-4393-BB1B-4310D24E7240\"},{\"notes\":[],\"name\":\"50\",\"status\":2,\"identifier\":\"DBE0867C-B763-4B39-8043-B06F624EA388\"}]")

I simply serialize JSON like this on String:

    do {

        guard let data = data(using: .utf8) else {
            return nil
        }

        guard let object = try JSONSerialization.jsonObject(with: data, options: []) as? [[AnyHashable: Any]] else {
            return nil
        }
        return object

    } catch {
        print("error: \(error)")
    }

But sometimes I get an following error and I do not know how to fix this:

error: Error Domain=NSCocoaErrorDomain Code=3840 "Unescaped control character around character 1833." UserInfo={NSDebugDescription=Unescaped control character around character 1833.}

Is it index of character in my String or something else? What does 1833 mean?

Upvotes: 0

Views: 1988

Answers (1)

OOPer
OOPer

Reputation: 47876

Is it index of character in my String or sth else? What 1833 mean?

It's a byte offset in the data.


In your case, bytes in data converted from your string:

+1829: f0
+1830: 9f
+1831: 99
+1832: 83
+1833: 0a <-
+1834: 0a
+1835: 57
+1836: 79
+1837: 72

(Offsets shown in decimal, each byte in hexadecimal.)

It's around here in your String: Aaaaaaaaaaaa🙃\n\nWyrazil. (Precisely, the 9 bytes above represent 🙃\n\nWyr.)

As Swift Optional outputs its content in a debugging form, \n represents a single control character U+000A, which is not valid in JSON string.

I don't see how you get that String, so I cannot show in code, but you need to fix the part which is generating such invalid JSON. Control characters in JSON string need to be escaped.

Upvotes: 1

Related Questions