【问题标题】:Server response differs on random which make Json.Parse fail服务器响应随机不同,这使得 Json.Parse 失败
【发布时间】:2019-04-16 01:21:04
【问题描述】:

我遇到了一个非常奇怪的问题,让我发疯。我开始注意到我的 Json.Parse 有时会失败。看起来是这样的

const Info = JSON.parse(response);
this.onInfoUpdate(Info.InfoConfig[0]);

我得到的两个不同的回应是

"{\"InfoConfig\":[{\"InfoId\":1,\"InfoName\":\"Derp\",\"Pid\":0,\"StartDate\":\"2018-10-31T00:00:00\",\"EndDate\":\"2018-11-10T00:00:00\",\"InclusiveFilters\":null,\"ExlusiveFilters\":null,\"Type\":0}],\"InfoIds\":["1"],\"Guid\":\"2#myman\"}"

它无法解析为 Json 对象。我不知道为什么它有时会决定删除 \ 并且整个数组周围也没有“”

{"InfoConfig":[{"InfoId":1,"InfoName":"Derp","Pid":0,"StartDate":"2018-10-31T00:00:00","EndDate":"2018-11-10T00:00:00","InclusiveFilters":null,"ExlusiveFilters":null,"Type":0}],"InfoIds":["1"],"Guid":"2#myman"}

这个工作正常,JSON.parse 将其转换为 Json 对象。但有时我会得到回应

这是将数据发送到前端的部分

case HiveMessageType.PlayerInfo:
                var playerNotification = (PlayerInfoNotificationModel)message;
                var InfoIds = JsonConvert.SerializeObject(playerNotification.InfoIds);
                var serializedListWithInfo = JsonConvert.SerializeObject(playerNotification);
                SignalRClient.SendAsync("RegisterUserToMultipleGroups", playerNotification.Guid, InfoIds, serializedListWithInfo);
                break;

【问题讨论】:

  • 后端的代码是什么?
  • @maxs87 在发送它的部分编辑
  • 我不确定 signalR,但我会​​在没有 SerializeObject 的情况下测试 SendAsync,这对我来说似乎很奇怪,默认情况下这种方法不进行序列化。此外,查看整个 switch case 结构也会很有趣——应该有合乎逻辑的解释,为什么你在不同的情况下会有不同的行为。也许你以不同的方式处理不同的“案例”?
  • @maxs87 也没有修复它:/ 演员结构是因为它是一个接收消息的函数,然后它会向所有用户或仅向特定用户广播。
  • 看起来第一种情况正在被双重序列化。您可能正在序列化过程中早些时候已经序列化的东西吗?另请注意,某些框架旨在为您处理序列化,因此如果您在此之上进行序列化,您最终会看到反斜杠。

标签: javascript c# json typescript server


【解决方案1】:

第一个响应是纯字符串,而第二个响应是标准 javascript 对象。

请将JSON.parse 包裹在 try-catch 块中,以防止解析异常导致您的应用崩溃。

将变量包装在JSON.stringify 中会将变量数据转换为字符串(如果它还不是字符串)。

var Info;
try {
  Info = JSON.parse(JSON.stringify(response));
} catch(e) {
  // Suppress the exception
  Info = response
}

// Use variable `Info` for further processing.

【讨论】:

  • 我试过了,但每次都失败。经过更多调查,它似乎是它能够解析的第二个响应,而不是第一个
  • 你试过我发布的解决方案了吗?
【解决方案2】:

我看到您在 HiveMessageType.PlayerInfo 上使用了 switch case。你有没有检查过当它不工作时你不是简单地进入了错误的 switch case,并且那个 switch 块中的代码没有更新到工作?

如果您每次使用相同的输入数据和代码,您会得到不同的输出,这似乎很奇怪。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-29
    • 1970-01-01
    • 1970-01-01
    • 2017-05-20
    • 1970-01-01
    相关资源
    最近更新 更多