如何反序列化包含多个 JSON 的字符串

分享于2022年07月17日 c# json json.net rest 问答
【问题标题】:如何反序列化包含多个 JSON 的字符串(How to deserialize a string containing multiple JSON)
【发布时间】:2022-07-14 22:39:19
【问题描述】:

有时,我的系统会通过 Timer 执行捕获 API 生成的事件列表的过程,但是,在尝试序列化时,它会返回以下错误。

Newtonsoft.Json.JsonReaderException: 'Unexpected character encountered while parsing value: {. Path '[1].metadata', line 1, position 453.'

在这种情况下,这是我从 API 获得的字符串。

[{"id":"6ed69e14-6610-4b57-a06f-328f38a9e2aa","code":"PLC","fullCode":"PLACED","orderId":"c6184662-2116-4a66-9f6b-4e6caca59e0d","merchantId":"355d10e6-8825-46e3-81dc-0961bf27a5dc","createdAt":"2022-07-14T12:45:34.142Z"},{"id":"e064302e-6a65-4821-ba4c-ea7021aaf8cc","code":"CAN","fullCode":"CANCELLED","orderId":"c6184662-2116-4a66-9f6b-4e6caca59e0d","merchantId":"355d10e6-8825-46e3-81dc-0961bf27a5dc","createdAt":"2022-07-14T12:53:34.674Z","metadata":{"CANCEL_STAGE":"[PRE_CONFIRMED]","ORIGIN":"IfoodGatewayAgent","CANCEL_CODE":"902","CANCELLATION_DISPUTE":{"IS_CONTESTABLE":"CANCELLATION_IS_NOT_CONTESTABLE","REASON":"NO_CREDIT_FOR_ORDER_LIABILITIES"},"CANCELLATION_OCCURRENCE":{"tags":["NO_CREDIT_FOR_ORDER_LIABILITIES"],"RESTAURANT":{"FINANCIAL_OCCURRENCE":"NA","PAYMENT_TYPE":"NA"},"CONSUMER":{"FINANCIAL_OCCURRENCE":"NA","PAYMENT_TYPE":"NA"},"LOGISTIC":{"FINANCIAL_OCCURRENCE":"NA","PAYMENT_TYPE":"NA"}},"TIMEOUT_EVENT":false,"CANCEL_ORIGIN":"RESTAURANT","CANCEL_REASON":"AUTOMATICO - NAO CONFIRMADO PELO RESTAURANTE","CANCEL_USER":"Order BackOffice Scheduler","CANCELLATION_REQUESTED_EVENT_ID":"17da3940-661e-4d9c-a15a-57f5d1b06474"}}]

这是代码中出现错误的部分:

var data = response.Content.ReadAsStringAsync();
var bodyResponse = JsonConvert.DeserializeObject>(await data);

班级订单状态:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Newtonsoft.Json;

namespace SAFI_Delivery.Classes
{
    internal class OrderStatus
    {
        [JsonProperty("id")]
        public string ID { get; set; }
        [JsonProperty("code")]
        public string Code { get; set; }
        [JsonProperty("fullCode")]
        public string FullCode { get; set; }
        [JsonProperty("orderId")]
        public string OrderID { get; set; }
        [JsonProperty("merchantId")]
        public string MerchantID { get; set; }
        [JsonProperty("createdAt")]
        public string CreatedAt { get; set; }
        [JsonProperty("metadata")]
        public string Metadata { get; set; }
    }
}

我想知道如何让它认为这是一个列表而不是字符串?

  • 我对您使用的 JSON 库不太熟悉,但我怀疑问题在于,在您的 OrderStatus 类中,您将 Metadata 属性作为 string 类型,但在您的示例 JSON 中,“元数据”键具有对象值,而不是字符串值。
  • 如上所述, "metatdata" 的值是 JSON 对象而不是 JSON 字符串,因此您必须将其反序列化为一些适当的 c# 类。要自动生成该类,请参阅 How to auto-generate a C# class file from a JSON string
  • 是的,哈哈,我没想到,非常感谢:)
  • 也许尝试更改公共字符串元数据 { get;放; } 到公共对象元数据 { 获取;放; }

【解决方案1】:

已回答的问题。

谢谢,德鲁

我对您使用的 JSON 库不太熟悉,但我怀疑问题在于,在您的 OrderStatus 类中,您将 Metadata 属性作为字符串类型,但在您的示例 JSON 中,“元数据" 键有一个对象值,而不是字符串值。