JSON 字符 0 周围值无效调试

标签 json swift

如何正确调试错误消息

Error Domain=NSCocoaErrorDomain Code=3840 "Invalid value around character 0." UserInfo={NSDebugDescription=Invalid value around character 0.}

我在不同的场景中看到这种情况发生,但我总是很难找到真正的原因。 在上面的例子中,我有以下 url,并返回 JSON 响应:

http://SERVERIP/v1/aeds&latitude=48.1848308444472&longitude=11.2527083605633

通过 Postman 进行服务器响应

{
  "data": [
    {
      "deviceReference": "D200",
      "owner": "Owner 200",
      "latitude": "48.185240",
      "longitude": "11.258890",
      "street": "StreetName",
      "featureTypeId": "1"
    },
    {
      "deviceReference": "D300",
      "owner": "Owner 300",
      "latitude": "48.179290",
      "longitude": "11.253350",
      "street": "StreetName",
      "featureTypeId": "1"
    },
    {
      "deviceReference": "D100",
      "owner": "Owner 100",
      "latitude": "48.176226",
      "longitude": "11.238890",
      "street": "StreetName",
      "featureTypeId": "1"
    }
  ],
  "meta": {
    "Heading 1": "H1",
    "Heading 2": "H2"
  }
}

在我看来,json 已正确返回,但在通过 Alamofire 调用 URL 并处理它时,我仍然收到消息。

func getAEDInRange(latitude: Double, longitude: Double, completionHandler: (Result<[AED], NSError>) -> Void) {
    Alamofire.request(Router.GetAEDInRange("?latitude=\(latitude)&longitude=\(longitude)")).responseArray { (response: Response<[AED], NSError>) -> Void in
        print(response.result)
    }
}

responseArray方法

public func responseArray<T: ResponseJSONObjectSerializable>(completionHandler: Response<[T], NSError> -> Void) -> Self {
    let serializer = ResponseSerializer<[T], NSError> { request, response, data, error in

        guard error == nil else {
            return .Failure(error!)
        }

        guard let responseData = data else {
            let failureReason = "Array could not be serialized because input data was nil."
            let error = Error.errorWithCode(.DataSerializationFailed, failureReason: failureReason)
            return .Failure(error)
        }

        let JSONResponseSerializer = Request.JSONResponseSerializer(options: .AllowFragments)
        let result = JSONResponseSerializer.serializeResponse(request, response, responseData, error)

        switch result {

        case .Success(let value):
            let json = SwiftyJSON.JSON(value)

            // Get Data content of JSON
            let jsonData = json["data"]

            var objects: [T] = []
            for (_, item) in jsonData {
                if let object = T(json: item) {
                    objects.append(object)
                }
            }
            return .Success(objects)

        case .Failure(let error):
            return .Failure(error)
        }
    }
    return response(responseSerializer: serializer, completionHandler: completionHandler)
}

浏览器中返回的文字 URL:

{"data":[{"deviceReference":"D200","owner":"Owner 200","latitude":"48.185240","longitude":"11.258890","street":"StreetName","featureTypeId":"1"},{"deviceReference":"D300","owner":"Owner 300","latitude":"48.179290","longitude":"11.253350","street":"StreetName","featureTypeId":"1"},{"deviceReference":"D100","owner":"Owner 100","latitude":"48.176226","longitude":"11.238890","street":"StreetName","featureTypeId":"1"}],"meta":{"Heading 1":"H1","Heading 2":"H2"}}

最佳答案

如果您的 JSON 文档看起来不错,但无法解析(“字符 0 周围的错误”),则原因有两种明显的可能性:一是看起来不错的 JSON 文档不是您想要的文档正在尝试解析。第二,看起来不错,但其实并不好。例如,如果数据中有零字节会转换为不可见字符。

当错误发生时,将 NSData 的第一个字节记录为字节并检查实际情况。并在错误发生的确切时间记录转换为字符串的解析数据。

将AllowFragments 作为参数传递是无意义的。你并不期待一个片段。您不知道如何处理片段。如果有片段,那对您来说就是一个错误。那么为什么允许呢?充其量它会导致困惑(因为解析的响应现在可以像通常一样是字典或数组,但也可以是数字、字符串或 null)。

BOM(字节顺序标记)实际上允许出现在文档的开头,但不能出现在文档内部 - 如果文档中间出现错误,则需要查找该内容。 “字节 0 处的错误”通常是零字节。

关于JSON 字符 0 周围值无效调试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35536024/

相关文章:

ios - 获取 NSDictionary 值作为 NSString

javascript - 为什么我的 js 不将 php 输出读取为 json

c# - JavaScriptSerializer - 枚举的 JSON 序列化为字符串

swift - 按特定顺序用数组填充 UIPickerView

ios - 使用 watchOS 2,我可以多快在 iPhone 和 Apple Watch 之间发送 UIImage?

json - 在 flutter 中从 API 获取数据时获取错误类型'_InternalLinkedHashMap<String, dynamic >' is not a subtype of type ' Iterable<dynamic>'

json - 使用 ngFor-Loop (Angular) 显示 JSON

ios - 在 iOS 中镜像前置摄像头视频

iOS Swift - AVCaptureSession - 根据帧速率捕获帧

swift - 为什么我的 alamofire multiformdata 上传请求会出现不明确的引用错误?