【问题标题】:Cannot deserealize Json string (C#)无法反序列化 Json 字符串(C#)
【发布时间】:2021-04-26 06:54:10
【问题描述】:

我有来自 AWS Lambda 的 JSON 字符串:

   "body": "{'From': nemesises@live.com, 'To': suhomlin.eugene93@gmail.com}",

并尝试像这样反序列化它

 var email = JsonConvert.DeserializeObject<SendEmailMessage>(emailRequest.Message);

这是我需要反序列化的类

 public class SendEmailMessage
{
    public string From { get; set; }
    
    public string To { get; set; }
    
    public object Data { get; set; }
    
    public int TemplateId { get; set; }
    
    public List<string> Attachments { get; set; }
}

但我得到了这个错误

Newtonsoft.Json.JsonReaderException:解析 JSON 时出现意外内容。路径“从”,第 1 行,位置 11。

我该如何解决这个问题?

【问题讨论】:

  • Json 结构要么封装在{} 中用于对象,要么封装在[] 中用于数组。这里我们没有 {} 。结构也不匹配。属性body 不匹配对象的任何属性。我建议使用像 quicktype.io 这样的自动类生成。一个简单的拷贝过去,类就生成了。
  • body proeprty {'From': nemesises@live.com, 'To': suhomlin.eugene93@gmail.com} 中还有一个奇怪的 js 对象。使用单引号属性名称和不带引号的值。您是否要反序列化该部分?因为未引用的价值将是一场噩梦。电子邮件地址允许,;: 在带引号的字符串中并且可以引用注释(单个)。给您留下一个未引用的未转义值,无论如何都不能引用。
  • 我需要用单引号引用它,因为据我所知,这是在 AWS Lambda 正文 @Self 中发送 JSON 的唯一方法
  • 我的评论是关于未引用的价值。单引号不是问题。如果您正确地单引号,例如{'From': 'nemesises@live.com', 'To': 'suhomlin.eugene93@gmail.com'}。有用。 dotnetfiddle.net/5bMeGW
  • 正确的方法是对"body": "{\"foo\":\"bar\"}",进行适当的序列化和适当的转义。

标签: c# json .net


【解决方案1】:

您需要将整个 json 包装在 {} 中。

{
"body": "{'From': nemesises@live.com, 'To': suhomlin.eugene93@gmail.com}"
}

您可以使用https://jsonlint.com/ 之类的网站来解决此类问题。

【讨论】:

  • 这是一个起点......但body 属性的值可能是有效的 JSON,但它不是。
【解决方案2】:

所以问题出在正文的格式上

这里正确的格式是

{
    "Records": [
      {
        "messageId": "19dd0b57-b21e-4ac1-bd88-01bbb068cb78",
        "receiptHandle": "MessageReceiptHandle",
        "body": "{ \"Message\":\"{ 'from': 'nemesises@live.com','to': 'suhomlin.eugene93@gmail.com',}\"}",
        "attributes": {
          "ApproximateReceiveCount": "1",
          "SentTimestamp": "1523232000000",
          "SenderId": "123456789012",
          "ApproximateFirstReceiveTimestamp": "1523232000001"
        },
        "messageAttributes": {},
        "md5OfBody": "7b270e59b47ff90a553787216d55d91d",
        "eventSource": "aws:sqs",
        "eventSourceARN": "arn:{partition}:sqs:{region}:123456789012:MyQueue",
        "awsRegion": "{region}"
      }
    ]
  }

【讨论】:

    猜你喜欢
    • 2021-02-26
    • 1970-01-01
    • 2023-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多