JSONDecoder不能解码Array,但可以解码String。

我有一个结构,我想从Json中解析。

struct Subsidiary: Decodable {
    let id: Int?
    let subsidiary_ref: String?
    let name: String?
    let address: String?
}

我试着像这样解析它:

let sub: [Subsidiary] = try! JSONDecoder().decode([Subsidiary].self, from: data)

其中data是数据类型,来自

session.dataTask(with: urlRequest) { (data, response, error) in

但它给我一个错误

Fatal error: 'try!' expression unexpectedly raised an error: Swift.DecodingError.typeMismatch(Swift.Array<Any>, Swift.DecodingError.Context(codingPath: [], debugDescription: "Expected to decode Array<Any> but found a string/data instead.", underlyingError: nil))

如果我这样做,

let sub: String = try! JSONDecoder().decode(String.self, from: data)

它的工作,它给我的儿子

[
   {"id": 5913, "subsidiary_ref": "0000159", "name": "Mercator Hipermarket Koper", "address": "Poslov.98-Koper,Dolinska C", "city": "Koper", "coordinates_x": null, "coordinates_y": null, "phone_number": "+386 56-636-800", "frequency": "A", "channel": "Food", "subchannel": "Hypermarket", "customer": 7, "day_planned": true, "badge_visible": true, "open_call": true, "number_of_planned": 13, "number_of_calls": 22, "last_call_day": 3, "notes": " notesi ki ne smejo nikoli zginiti bla marko bdsa"},
    {"id": 5870, "subsidiary_ref": "0000773", "name": "Kompas Shop Pe Ferneti?i", "address": "Partizanska 150", "city": "Se?ana", "coordinates_x": null, "coordinates_y": null, "phone_number": "+386 57-380-636", "frequency": "A", "channel": "Food", "subchannel": "Supermarket", "customer": 17, "day_planned": true, "badge_visible": true, "open_call": true, "number_of_planned": 13, "number_of_calls": 1, "last_call_day": 1, "notes": null},...
]

我的代码有什么问题?

EDIT:

我发现,如果我创建一个 string 变量,然后将这个字符串值转换为数据,它甚至可以与 Subsidiary 结构。

所以应该是在 data 变量。

解决方案:

事实上,你可以解码一个 String.self 并让你的JSON打印出来,意味着JSON的根是一个字符串。你得到的JSON,在文本形式上,可能是这样的。

"[\r\n   {\"id\": 5913, \"subsidiary_ref\": \"0000159\", \"name\": \"Mercator Hipermarket Koper\", \"address\": \"Poslov.98-Koper,Dolinska C\", \"city\": \"Koper\", \"coordinates_x\": null, \"coordinates_y\": null, \"phone_number\": \"+386 56-636-800\", \"frequency\": \"A\", \"channel\": \"Food\", \"subchannel\": \"Hypermarket\", \"customer\": 7, \"day_planned\": true, \"badge_visible\": true, \"open_call\": true, \"number_of_planned\": 13, \"number_of_calls\": 22, \"last_call_day\": 3, \"notes\": \" notesi ki ne smejo nikoli zginiti bla marko bdsa\"}\r\n]"

请注意,你想要的JSON格式是放在了 ""s,所以所有的特殊字符都被转义了。

网络服务以一种非常奇怪的方式给出了JSON…。

要想得到实际的JSON数据解码,你需要先得到字符串,然后将字符串转化为 Data,然后对其进行解码 Data 再次。

// nil handling omitted for brevity
let jsonString = try! JSONDecoder().decode(String.self, from: data)
let jsonData = jsonString.data(using: .utf8)!
let sub = try! JSONDecoder().decode([Subsidiary].self, from: jsonData)

当然,最好的解决办法是修复后端。

给TA打赏
共{{data.count}}人
人已打赏
未分类

如何在.NET Core中向项目文件夹写入文件?

2022-9-9 9:54:19

未分类

wp_generate_password返回密码,但无法使用它登录。

2022-9-9 9:54:21

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索