【问题标题】:How to debug JSON Serialization error?如何调试 JSON 序列化错误?
【发布时间】:2016-09-23 16:12:43
【问题描述】:

我有以下异常不一致但经常生成:

System.Exception: Serialization error - One or more errors occurred., Unexpected character encountered while parsing value: <. Path '', line 0, position 0., System.AggregateException: One or more errors occurred. ---> Newtonsoft.Json.JsonReaderException: Unexpected character encountered while parsing value: <. Path '', line 0, position 0.
   at Newtonsoft.Json.JsonTextReader.ParseValue()
   at Newtonsoft.Json.JsonTextReader.Read()
   at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.ReadForType(JsonReader reader, JsonContract contract, Boolean hasConverter)
   at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.Deserialize(JsonReader reader, Type objectType, Boolean checkAdditionalContent)
   at Newtonsoft.Json.JsonSerializer.DeserializeInternal(JsonReader reader, Type objectType)
   at Newtonsoft.Json.JsonConvert.DeserializeObject(String value, Type type, JsonSerializerSettings settings)
   at Newtonsoft.Json.JsonConvert.DeserializeObject[T](String value, JsonSerializerSettings settings)
   at Microsoft.AspNet.SignalR.Client.Transports.TransportHelper.b__1(String raw)
   at Microsoft.AspNet.SignalR.TaskAsyncHelper.<>c__DisplayClass19`2.b__17(Task`1 t)
   at Microsoft.AspNet.SignalR.TaskAsyncHelper.TaskRunners`2.<>c__DisplayClass42.b__41(Task`1 t)
   --- End of inner exception stack trace ---
   at System.Threading.Tasks.Task.ThrowIfExceptional(Boolean includeTaskCanceledExceptions)
   at System.Threading.Tasks.Task.Wait(Int32 millisecondsTimeout, CancellationToken cancellationToken)
   **at Project.Services.NotificationService.SignalObjectToUser(Object data, String username, Boolean isTypingNotification)
---> (Inner Exception #0) Newtonsoft.Json.JsonReaderException: Unexpected character encountered while parsing value: <. Path '', line 0, position 0.**
   at Newtonsoft.Json.JsonTextReader.ParseValue()
   at Newtonsoft.Json.JsonTextReader.Read()
   at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.ReadForType(JsonReader reader, JsonContract contract, Boolean hasConverter)
   at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.Deserialize(JsonReader reader, Type objectType, Boolean checkAdditionalContent)
   at Newtonsoft.Json.JsonSerializer.DeserializeInternal(JsonReader reader, Type objectType)
   at Newtonsoft.Json.JsonConvert.DeserializeObject(String value, Type type, JsonSerializerSettings settings)
   at Newtonsoft.Json.JsonConvert.DeserializeObject[T](String value, JsonSerializerSettings settings)
   at Microsoft.AspNet.SignalR.Client.Transports.TransportHelper.b__1(String raw)
   at Microsoft.AspNet.SignalR.TaskAsyncHelper.<>c__DisplayClass19`2.b__17(Task`1 t)

重要的一点:

**at Project.Services.NotificationService.SignalObjectToUser(Object data, String username, Boolean isTypingNotification)
---> (Inner Exception #0) Newtonsoft.Json.JsonReaderException: Unexpected character encountered while parsing value: <. Path '', line 0, position 0.**

我的代码:

private void SignalObjectToUser(object data, string username, bool isTypingNotification = false) {
        try {
            _hubConnection = new HubConnection(_baseUrl);
            _hubConnection.CookieContainer = new CookieContainer();
            _hubConnection.CookieContainer.Add(_cookie);
            _hubProxy = _hubConnection.CreateHubProxy("appHub");
            _hubConnection.Start().Wait();
            string serialized = null;
            try {
                List<string> errors = new List<string>();
                serialized = JsonConvert.SerializeObject(data, new JsonSerializerSettings() {
                    Error = delegate(object sender, ErrorEventArgs args) {
                        errors.Add(args.ErrorContext.Error.Message);
                        args.ErrorContext.Handled = true;
                        Elmah.ErrorSignal.FromCurrentContext().Raise(new Exception("Delegated serialization error - " + args.ErrorContext.Error.Message));
                    }
                });
                _hubProxy.Invoke((isTypingNotification ? "SendTypingNotification" : "SendClientNotification"), serialized, username).Wait();
            }
            catch (Exception exception) {
                Elmah.ErrorSignal.FromCurrentContext().Raise(new Exception("Serialization error - " + exception.Message + ", " + exception.InnerException.Message + ", " + exception.ToString()));
                throw new Exception("Messaging Error");
            }
        }
        catch (Exception e) {
            Elmah.ErrorSignal.FromCurrentContext().Raise(new Exception("Serialization error - " + e.Message + ", " + e.InnerException.Message + ", " + e.ToString()));
            throw new Exception("Messaging Error");
        }
    }

我正在尝试找出 究竟是什么 导致了这个问题。我不知道是什么键/值对产生了异常。我怎样才能在这里收集更多有启发性的细节?

【问题讨论】:

  • 错误表示意外字符是&lt; 在第 0 行位置 0。您是否将 XML 传递给 JSON 反序列化器?如果是这样,那就是问题所在。有效的 JSON永远不会以 &lt; 开头
  • @BrianRogers 似乎我不知何故,但我不知道如何或何时。我希望有一种预序列化的方法,以便我可以看到序列化问题,哈!

标签: .net serialization exception-handling json.net elmah


【解决方案1】:

看起来您的端点 (_baseUrl) 应该返回 JSON,但实际上返回的是 XML 或 HTML。如果在请求 _baseUrl 时出现内部服务器错误、错误请求、未找到或类似情况,就会发生这种情况。如果您尝试在浏览器、Postman 或类似浏览器中请求 URL,您可能会看到 HTML 响应和状态代码。

【讨论】:

  • 这是给我的。
  • 从 Visual Studio 向远程端点执行 POST 时出现相同的错误。从 Postman 发送类似的请求会有所帮助。由于 nginx 配置错误,端点返回了 HTML。端点上的 nginx 和应用程序日志也有帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-05
  • 2015-02-07
  • 2018-07-28
  • 2018-11-26
  • 1970-01-01
相关资源
最近更新 更多