JSON解析错误Swift 3

Posted

技术标签:

【中文标题】JSON解析错误Swift 3【英文标题】:JSON parse error Swift 3 【发布时间】:2017-03-22 23:15:19 【问题描述】:

我有一些不明白的错误.. 好吧,我发送此代码

JSONARRAY 
 JSON,
 JSONARRAY,
 JSONARRAY

Y 有这个但不工作或解析不正确,不管两个数组没有添加任何东西

buscarEmpresa=[

"\n  \"criterio\" : \"fru\",\n  \"tipo\" : \"0\",\n  \"idempresa\" : \"82\"\n",
  [

  ],
  [

  ]
]

无法读取数据,因为格式不正确。

试试这个代码..

let usuario = UsuariosQL.getUsuario()!
var jArray: [AnyObject] = []

let jUsuario = NSMutableDictionary()
jUsuario.setValue((phBuscar.text?.trimmingCharacters(in: .whitespacesAndNewlines))!, forKey: "criterio")
jUsuario.setValue(String(describing: usuario.tipo_negocio), forKey: "tipo")
jUsuario.setValue(String(describing: usuario.id_server), forKey: "idempresa")
let jData = try! JSONSerialization.data(withJSONObject: jUsuario, options: .prettyPrinted)
let jStr = NSString(data: jData, encoding: String.Encoding.utf8.rawValue) as! String
jArray.append(jStr as AnyObject)

let jaEmpresarial = NSMutableArray()
for i in receive_empresarial 
            let jEmpresarial = NSMutableDictionary()
            jEmpresarial.setValue(i, forKey: "empresarial")
            jaEmpresarial.add(jEmpresarial)

jArray.append(jaEmpresarial)

let jaPais = NSMutableArray()
for i in receive_paises 
      let jPais = NSMutableDictionary()
      jPais.setValue(i, forKey: "pais")
      jaPais.add(jPais)
 
 jArray.append(jaPais)


 let post = try! JSONSerialization.data(withJSONObject: jArray, options: .prettyPrinted)
 let jPost = NSString(data: post, encoding: String.Encoding.utf8.rawValue) as! String

 let sesion = URLSession.shared
 let parameters = "buscarEmpresa=\(jPost)"
 print(parameters)

【问题讨论】:

上面的代码本身似乎工作正常。你从哪里得到错误?此外,在 Swift 代码中使用带有类型信息的 Swift 数组和字典比使用 NSArrayNSDictionary 更好... 好的,但是请给一些教程或示例? 查看我的答案的更新 - 我根据您的代码输出添加了一些有效的 JSON。 【参考方案1】:

生成的数据不是有效的 JSON。这可能就是您收到错误的原因。您可以使用 JSON 验证器来验证这一点,如果您愿意,但取决于您希望如何设置,您可能需要这行 JSON:

\n  \"criterio\" : \"some criteria\",\n  \"tipo\" : \"Type\",\n  \"idempresa\" : \"ID\"\n

在 JSON 对象中表示为键值对,或表示为键的值。像这样的东西是有效的:


    "criterio": "some criteria",
    "tipo": "Type",
    "idempresa": "ID",
    "empresarial": [
        "empresarial": 1
    , 
        "empresarial": 2
    , 
        "empresarial": 3
    , 
        "empresarial": 4
    ],
    "pais": [
        "pais": 10
    , 
        "pais": 20
    , 
        "pais": 30
    ]

您可以使用此JSON validator 来验证您自己的 JSON。

【讨论】:

【参考方案2】:

朋友们,我已经解决了..有变化

这对我不起作用,所以进行更改..

let usuario = UsuarioSQL.getUsuario()!
var jArray: [AnyObject] = []
    let jUsuario = NSMutableDictionary()
    jUsuario.setValue((phBuscar.text?.trimmingCharacters(in: .whitespacesAndNewlines))!, forKey: "criterio")
    jUsuario.setValue(String(describing: usuario.tipo_negocio), forKey: "tipo")
    jUsuario.setValue(String(describing: usuario.id_server), forKey: "idempresa")
    let jData = try! JSONSerialization.data(withJSONObject: jUsuario, options: .prettyPrinted)
    let jStr = NSString(data: jData, encoding: String.Encoding.utf8.rawValue) as! String
    jArray.append(jStr as AnyObject)

这对我来说很好用

let usuario = UsuarioSQL.getUsuario()!
        var jArray: [AnyObject] = []
        let jUser: NSMutableDictionary = [
            "criterio" : String(describing: phBuscar.text!.trimmingCharacters(in: .whitespacesAndNewlines)),
            "tipo" : String(usuario.tipo_negocio),
            "idempresa" : String(usuario.id_server)
        ]
        jArray.append(jUser)

最后我还对循环进行了更改

let usuario = UsuarioSQL.getUsuario()!
    var jArray: [AnyObject] = []
    let jUser: NSMutableDictionary = [
        "criterio" : String(describing: phBuscar.text!.trimmingCharacters(in: .whitespacesAndNewlines)),
        "tipo" : String(usuario.tipo_negocio),
        "idempresa" : String(usuario.id_server)
    ]
    jArray.append(jUser)

    let jaEmpresarial = NSMutableArray()
    for i in receive_empresarial 
        let jEmpresarial: NSMutableDictionary = [
            "empresarial" : i
        ]
        jaEmpresarial.add(jEmpresarial)
    
    jArray.append(jaEmpresarial)

    let jaPais = NSMutableArray()
    for i in receive_paises 
        let jPais:NSMutableDictionary = [
            "pais" : i
        ]
        jaPais.add(jPais)
    
    jArray.append(jaPais)

    let post = try! JSONSerialization.data(withJSONObject: jArray, options: .prettyPrinted)
    let jPost = NSString(data: post, encoding: String.Encoding.utf8.rawValue) as! String

    let sesion = URLSession.shared
    let parameters = "buscarEmpresa=\(jPost)"
    print(parameters)

谢谢大家的回答,非常感谢

【讨论】:

以上是关于JSON解析错误Swift 3的主要内容,如果未能解决你的问题,请参考以下文章

Swift json 解析错误:无法将 NSCFConstantString 类型的值转换为 NSArray

Swift JSON 解析错误?

使用 Codable 解析 JSON 响应会在 swift 中出现错误

Json 解析 Swift 3 Alamofire

Swift 3.0 中的 JSON 解析失败

无法在swift 3中解析Json?