Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/287.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
复杂的Json到C#对象与类反序列化_C#_Json_Json.net - Fatal编程技术网

复杂的Json到C#对象与类反序列化

复杂的Json到C#对象与类反序列化,c#,json,json.net,C#,Json,Json.net,我正在尝试反序列化从web调用获得的json响应。我有90%的答案。我很难弄清楚的唯一一点是,这些json数组中包含数据,并且使用电子邮件地址,每个数组名称都是唯一的。我还不知道如何将电子邮件数组转换为1。动态的,让它根据响应中返回的内容创建多个列表或一对列表,并动态命名列表数组以将数据放入Records类中 正如你在Records类中所看到的,我需要更动态、更灵活地接收任何和所有电子邮件 以下是json: { "result": { "records&

我正在尝试反序列化从web调用获得的json响应。我有90%的答案。我很难弄清楚的唯一一点是,这些json数组中包含数据,并且使用电子邮件地址,每个数组名称都是唯一的。我还不知道如何将电子邮件数组转换为1。动态的,让它根据响应中返回的内容创建多个列表或一对列表,并动态命名列表数组以将数据放入Records类中

正如你在Records类中所看到的,我需要更动态、更灵活地接收任何和所有电子邮件

以下是json:

{
  "result": {
    "records": {
      "joeblow@gmail.com": [
        {
          "OrderId": "d9535109-d305-4584-a503-8194bbcfcff2",
          "CompletedOrderId": "BCFCFF2",
          "CustomerId": 1212,
          "CompletedTime": "2020-10-26 13:32:02",
          "Email": "joeblow@gmail.com",
          "ShippingFirstName": "Joe",
          "ShippingMiddleName": "",
          "ShippingLastName": "Blow",
          "LineItems": {
            "tfl.es.bluray": { "qty": 1 },
            "booklets.en.ebook": { "qty": 1 }
          }
        }
      ],
      "cleob@hotmail.com": [
        {
          "OrderId": "7bf97b3a-bc46-411c-bc30-12563326dba0",
          "CompletedOrderId": "326DBA0",
          "CustomerId": 1212,
          "CompletedTime": "2020-10-26 20:07:44",
          "Email": "cleob@hotmail.com",
          "ShippingFirstName": "Cleo",
          "ShippingMiddleName": "",
          "ShippingLastName": "Blue",
          "LineItems": {
            "tfl.es.bluray": { "qty": 1 },
            "booklets.en.ebook": { "qty": 1 },
            "aos.en.pb": { "qty": 1 },
            "course-tos.en.olr": { "qty": 1 },
            "pow-hsk-nofilm.en.combo": { "qty": 1 },
            "course-organizing.en.olr": { "qty": 1 }
          }
        }
      ],
      "johnd@gmail.com": [
        {
          "OrderId": "630f0dda-94c3-4b82-a070-2554004dce29",
          "CompletedOrderId": "04DCE29",
          "CustomerId": 12345,
          "CompletedTime": "2020-10-25 21:52:04",
          "Email": "johnd@gmail.com",
          "ShippingFirstName": "John",
          "ShippingMiddleName": "",
          "ShippingLastName": "Doe",
          "LineItems": {
            "tfl.es.bluray": { "qty": 1 },
            "booklets.en.ebook": { "qty": 1 },
            "aos.en.pb": { "qty": 1 },
            "course-tos.en.olr": { "qty": 1 },
            "pow-hsk-nofilm.en.combo": { "qty": 1 },
            "course-organizing.en.olr": { "qty": 1 },
            "oak-2007.en.cd": { "qty": 1 }
          }
        }
      ]
    },
    "errors": [
      {
        "id": "bademailaddress-yahoo.com",
        "message": "Email address 'bademailaddress-yahoo.com' is not a valid email address"
      }
    ]
  },
  "jsonrpc": "2.0",
  "id": 12345634523
} 
我为json反序列化创建的类:

public partial class JsonEmailDeSerializer
{
    [JsonProperty("result")]
    public Result Result { get; set; }

    [JsonProperty("jsonrpc")]
    public string Jsonrpc { get; set; }

    [JsonProperty("id")]
    public long Id { get; set; }
}

public partial class Result
{
    [JsonProperty("records")]
    public Records Records { get; set; }

    [JsonProperty("errors")]
    public List<Error> Errors { get; set; }
}

public partial class Error
{
    [JsonProperty("id")]
    public string Id { get; set; }

    [JsonProperty("message")]
    public string Message { get; set; }
}

public partial class Records
{
    [JsonProperty("joeblow@gmail.com")]
    public List<MailCom> JoeblowGmailCom { get; set; }

    [JsonProperty("cleob@hotmail.com")]
    public List<MailCom> CleobHotmailCom { get; set; }

    [JsonProperty("johnd@gmail.com")]
    public List<MailCom> JohndGmailCom { get; set; }
}

public partial class MailCom
{
    [JsonProperty("OrderId")]
    public Guid OrderId { get; set; }

    [JsonProperty("CompletedOrderId")]
    public string CompletedOrderId { get; set; }

    [JsonProperty("CustomerId")]
    public long CustomerId { get; set; }

    [JsonProperty("CompletedTime")]
    public DateTimeOffset CompletedTime { get; set; }

    [JsonProperty("Email")]
    public string Email { get; set; }

    [JsonProperty("ShippingFirstName")]
    public string ShippingFirstName { get; set; }

    [JsonProperty("ShippingMiddleName")]
    public string ShippingMiddleName { get; set; }

    [JsonProperty("ShippingLastName")]
    public string ShippingLastName { get; set; }

    [JsonProperty("LineItems")]
    public Dictionary<string, LineItem> LineItems { get; set; }
}

public partial class LineItem
{
    [JsonProperty("qty")]
    public long Qty { get; set; }
}

public partial class JsonEmailDeSerializer
{
    public static JsonEmailDeSerializer FromJson(string json) => JsonConvert.DeserializeObject<JsonEmailDeSerializer>(json, FedExShipper.Converter.Settings);
}

public static class Serialize
{
    public static string ToJson(this JsonEmailDeSerializer self) => JsonConvert.SerializeObject(self, FedExShipper.Converter.Settings);
}

internal static class Converter
{
    public static readonly JsonSerializerSettings Settings = new JsonSerializerSettings
    {
        MetadataPropertyHandling = MetadataPropertyHandling.Ignore,
        DateParseHandling = DateParseHandling.None,
        Converters =
        {
            new IsoDateTimeConverter { DateTimeStyles = DateTimeStyles.AssumeUniversal }
        },
    };
}
公共部分类JsonEmailDeSerializer
{
[JsonProperty(“结果”)]
公共结果结果{get;set;}
[JsonProperty(“jsonrpc”)]
公共字符串Jsonrpc{get;set;}
[JsonProperty(“id”)]
公共长Id{get;set;}
}
公共部分类结果
{
[JsonProperty(“记录”)]
公共记录记录{get;set;}
[JsonProperty(“错误”)]
公共列表错误{get;set;}
}
公共部分类错误
{
[JsonProperty(“id”)]
公共字符串Id{get;set;}
[JsonProperty(“消息”)]
公共字符串消息{get;set;}
}
公共部分类记录
{
[JsonProperty(”joeblow@gmail.com")]
公共列表JoeblowGmailCom{get;set;}
[JsonProperty(”cleob@hotmail.com")]
公共列表CleobHotmailCom{get;set;}
[JsonProperty(”johnd@gmail.com")]
公共列表JohndGmailCom{get;set;}
}
公共部分类MailCom
{
[JsonProperty(“OrderId”)]
公共Guid OrderId{get;set;}
[JsonProperty(“CompletedOrderId”)]
公共字符串CompletedOrderId{get;set;}
[JsonProperty(“CustomerId”)]
公共长CustomerId{get;set;}
[JsonProperty(“CompletedTime”)]
公共DateTimeOffset CompletedTime{get;set;}
[JsonProperty(“电子邮件”)]
公共字符串电子邮件{get;set;}
[JsonProperty(“ShippingFirstName”)]
公共字符串ShippingFirstName{get;set;}
[JsonProperty(“ShippingMiddleName”)]
公共字符串ShippingMiddleName{get;set;}
[JsonProperty(“ShippingLastName”)]
公共字符串ShippingLastName{get;set;}
[JsonProperty(“行项目”)]
公共字典行项{get;set;}
}
公共部分类行项
{
[JsonProperty(“数量”)]
公共长数量{get;set;}
}
公共部分类JsonEmailDeSerializer
{
公共静态JsonEmailDeSerializer FromJson(字符串json)=>JsonConvert.DeserializeObject(json,FedExShipper.Converter.Settings);
}
公共静态类序列化
{
公共静态字符串ToJson(此JsonEmailDeSerializer self)=>JsonConvert.SerializeObject(self,FedExShipper.Converter.Settings);
}
内部静态类转换器
{
公共静态只读JsonSerializerSettings设置=新JsonSerializerSettings
{
MetadataPropertyHandling=MetadataPropertyHandling.Ignore,
DateParseHandling=DateParseHandling.None,
转换器=
{
新的IsoDateTimeConverter{DateTimeStyles=DateTimeStyles.AssumeUniversal}
},
};
}

永远不会正确序列化到类


您至少必须使用较低级别的API来读取文档中的该级别。

您可以使用
字典
for records属性:

public partial class Result
{
    [JsonProperty("records")]
    public Dictionary<string, List<MailCom>> Records { get; set; }

    [JsonProperty("errors")]
    public List<Error> Errors { get; set; }
}
公共部分类结果
{
[JsonProperty(“记录”)]
公共字典记录{get;set;}
[JsonProperty(“错误”)]
公共列表错误{get;set;}
}

Json.NET可以处理Json对象属性,这使得它适合反序列化此类动态数据。

因此我知道您需要的语言是C#,但如果您拥有或正在使用Visual Studio代码,则可以安装Json-to-Typescript转换器,该转换器可以将Json字符串转换为等效的TS类。我知道它不是C#,但TS很容易翻译成C。这是一个你可以在VS marketplace中找到的很受欢迎的方法。这个方法非常有效!“谢谢你!”汤姆格拉芬很乐意帮忙!