【问题标题】:JSON - WepAPI - Unexpected character encountered while parsing valueJSON - Web API - 解析值时遇到意外字符
【发布时间】:2018-07-03 02:13:26
【问题描述】:

任何帮助将不胜感激

我有一个促进 WebAPI 调用的通用类,它已经存在了很长一段时间并且没有任何问题。今天我遇到了一个错误,不知道在哪里跟踪问题。确切的错误是

{"Unexpected character encountered while parsing value: [. Path 'PayLoad', line 1, position 12."}

通话结果我得到的是

"{\"PayLoad\":[\"file_upload_null20180629155922²AAGUWVP2XUezeM3CiEnSOw.pdf\"],\"Success\":true,\"Message\":\"1 File(s) Uploaded\",\"Exceptions\":[]}"

这看起来不错,是我期望从服务调用中得到的结果

这是我正在调用的方法,它突然停止工作,并且在最后一行失败

        public static TR WebApiPost(string serveraddress, string endpoint, object data)
    {

        HttpResponseMessage msg;
        var clienthandler = new HttpClientHandler
        {
            UseDefaultCredentials = false,
            Credentials = new NetworkCredential(user, password, domain)
        };

        using (var client = new HttpClient(clienthandler) { BaseAddress = new Uri(serveraddress) })
        {
            client.DefaultRequestHeaders.Accept.Clear();
            client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
            msg = client.PostAsync(endpoint, new StringContent(new JavaScriptSerializer().Serialize(data), Encoding.UTF8, "application/json")).Result;
        }

        var result = msg.Content.ReadAsStringAsync().Result;
        return JsonConvert.DeserializeObject<TR>(result);
    }

最后是实际拨打电话的那一行(这无关紧要)

returned = CallHelper<ResultStatus<string>>.WebApiPost(serviceurl, sendFileUrl, model);

【问题讨论】:

    标签: json asp.net-web-api deserialization webservice-client


    【解决方案1】:

    不清楚您的 Web 服务从哪里获取 PayLoad 的值,因此该值很可能在其开头有一个字节顺序标记 (BOM)。如果您要返回最初是 Unicode 编码文件的内容,情况尤其如此。 请注意,在调试器中查看字符串时,BOM 是不可见的。

    在您的 Web 服务上,确保您没有在 PayLoad 的值中返回 BOM。检查字符串开头的这个字节序列:

    0xEF,0xBB,0xBF
    

    有关字节顺序标记的更多信息: https://en.wikipedia.org/wiki/Byte_order_mark

    【讨论】:

    • 我的所有调用都返回一个名为 ResultStatus 的对象,该对象具有几个属性 Success(bool 是否有效)一条消息(字符串 OK 或问题摘要),Exceptions {包含一个或更多问题)和 TR 类型的可选 PayLoad 在这种情况下 Payload 是一个字符串 ResultStatus 表示有效负载是一个字符串
    • 这里是反序列化前的服务调用结果 "{\"PayLoad\":[\"file_upload_null20180629155922²AAGUWVP2XUezeM3CiEnSOw.pdf\"],\"Success\":true,\"Message\" :\"1 个文件已上传\",\"例外情况\":[]}"
    • 我不相信您在 cmets 中提到的设置方面有任何问题——我指的是 PayLoad 数组中的字符串存在潜在问题,特别是 file_upload_null20180629155922²AAGUWVP2XUezeM3CiEnSOw.pdf .它看起来很无辜,但如果字符串包含 BOM(您将无法看到;您必须检查构成字符串的字节),您最终可能会遇到解析问题。尝试让您的端点在有效负载中简单地返回“foobar”,如果它有效,则说明您遇到了 BOM 问题...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-09
    • 2016-02-24
    • 1970-01-01
    • 1970-01-01
    • 2017-04-10
    • 1970-01-01
    相关资源
    最近更新 更多