C# J定制媒体类型的序列化,赢得数据';不能反序列化

C# J定制媒体类型的序列化,赢得数据';不能反序列化,c#,serialization,asp.net-core,C#,Serialization,Asp.net Core,嘿,我正在尝试反序列化一些服务发送到我的端点的json流。 问题是此服务使用自定义媒体类型向我发送数据,该媒体类型为: application/vnd.docker.distribution.manifest.v2+json 例如,我从内存stram中捕获并保存在文件中的流: { "events": [ { "id": "7a604759-812c-421a-a182-3928b9eb66d6", "timestamp": "2018-07-

嘿,我正在尝试反序列化一些服务发送到我的端点的json流。 问题是此服务使用自定义媒体类型向我发送数据,该媒体类型为:

application/vnd.docker.distribution.manifest.v2+json

例如,我从内存stram中捕获并保存在文件中的流:

{
   "events": [
      {
         "id": "7a604759-812c-421a-a182-3928b9eb66d6",
         "timestamp": "2018-07-03T09:04:37.617519518Z",
         "action": "push",
         "target": {
            "mediaType": "application/vnd.docker.distribution.manifest.v2+json",
            "size": 1375,
            "digest": "sha256:3ecc4d1b70b0c590284d24e6a8738981567bc54896ea03d4aa4a494eeeecc25a",
            "length": 1375,
            "repository": "microsoft",
            "url": "http://localhost:5000/v2/microsoft/manifests/sha256:3ecc4d1b70b0c590284d24e6a8738981567bc54896ea03d4aa4a494eeeecc25a",
            "tag": "latest"
         },
         "request": {
            "id": "6189c2c2-5b57-4970-9538-038b39fb22d2",
            "addr": "172.19.0.1:39304",
            "host": "localhost:5000",
            "method": "PUT",
            "useragent": "docker/18.03.1-ce go/go1.9.5 git-commit/9ee9f40 kernel/4.9.0-6-amd64 os/linux arch/amd64 UpstreamClient(Docker-Client/18.03.1-ce \\(linux\\))"
         },
         "actor": {},
         "source": {
            "addr": "b6203bc638de:5000",
            "instanceID": "375af6b0-42ff-4efd-a8c2-4f4c8b0edb35"
         }
      }
   ]
}
下面是我想要反序列化流的类:

[DataContract]
public class Ev
{
    [DataMember]
    public IList<Event> Events { get; set; }
}

[DataContract]
public class Event
{
    [DataMember]
    public Guid Id { get; set; }
    [DataMember]
    public DateTime Timestamp { get; set; }
    [DataMember]
    public string Action { get; set; }
}
问题是ev的事件属性为空,我想知道为什么。我的反序列化是否未正确启动?

您可以在VSCode中为json使用扩展名,它将生成以下类文件:

// Generated by https://quicktype.io

namespace QuickType
{
    using System;
    using System.Collections.Generic;

    using System.Globalization;
    using Newtonsoft.Json;
    using Newtonsoft.Json.Converters;

    public partial class TopLevel
    {
        [JsonProperty("events")]
        public Event[] Events { get; set; }
    }

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

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

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

        [JsonProperty("target")]
        public Target Target { get; set; }

        [JsonProperty("request")]
        public Request Request { get; set; }

        [JsonProperty("actor")]
        public Actor Actor { get; set; }

        [JsonProperty("source")]
        public Source Source { get; set; }
    }

    public partial class Actor
    {
    }

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

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

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

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

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

    public partial class Source
    {
        [JsonProperty("addr")]
        public string Addr { get; set; }

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

    public partial class Target
    {
        [JsonProperty("mediaType")]
        public string MediaType { get; set; }

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

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

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

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

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

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

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

    public static class Serialize
    {
        public static string ToJson(this TopLevel self) => JsonConvert.SerializeObject(self, QuickType.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 }
            },
        };
    }
}
//由生成https://quicktype.io
命名空间快速类型
{
使用制度;
使用System.Collections.Generic;
利用制度全球化;
使用Newtonsoft.Json;
使用Newtonsoft.Json.Converters;
公共部分类顶级
{
[JsonProperty(“事件”)]
公共事件[]事件{get;set;}
}
公开部分班级活动
{
[JsonProperty(“id”)]
公共字符串Id{get;set;}
[JsonProperty(“时间戳”)]
公共DateTimeOffset时间戳{get;set;}
[JsonProperty(“action”)]
公共字符串操作{get;set;}
[JsonProperty(“目标”)]
公共目标目标{get;set;}
[JsonProperty(“请求”)]
公共请求请求{get;set;}
[JsonProperty(“参与者”)]
公共参与者{get;set;}
[JsonProperty(“来源”)]
公共源{get;set;}
}
公共部分类参与者
{
}
公共部分类请求
{
[JsonProperty(“id”)]
公共字符串Id{get;set;}
[JsonProperty(“addr”)]
公共字符串Addr{get;set;}
[JsonProperty(“主机”)]
公共字符串主机{get;set;}
[JsonProperty(“方法”)]
公共字符串方法{get;set;}
[JsonProperty(“用户代理”)]
公共字符串用户代理{get;set;}
}
公共部分类源
{
[JsonProperty(“addr”)]
公共字符串Addr{get;set;}
[JsonProperty(“instanceID”)]
公共字符串InstanceId{get;set;}
}
公共部分类目标
{
[JsonProperty(“mediaType”)]
公共字符串媒体类型{get;set;}
[JsonProperty(“大小”)]
公共长大小{get;set;}
[JsonProperty(“摘要”)]
公共字符串摘要{get;set;}
[JsonProperty(“长度”)]
公共长长度{get;set;}
[JsonProperty(“存储库”)]
公共字符串存储库{get;set;}
[JsonProperty(“url”)]
公共字符串Url{get;set;}
[JsonProperty(“标记”)]
公共字符串标记{get;set;}
}
公共部分类顶级
{
公共静态顶级FromJson(字符串json)=>JsonConvert.DeserializeObject(json,QuickType.Converter.Settings);
}
公共静态类序列化
{
公共静态字符串ToJson(这个顶级self)=>JsonConvert.SerializeObject(self,QuickType.Converter.Settings);
}
内部静态类转换器
{
公共静态只读JsonSerializerSettings设置=新JsonSerializerSettings
{
MetadataPropertyHandling=MetadataPropertyHandling.Ignore,
DateParseHandling=DateParseHandling.None,
转换器={
新的IsoDateTimeConverter{DateTimeStyles=DateTimeStyles.AssumeUniversal}
},
};
}
}
然后应使用Newtonsoft正确序列化/反序列化

要与DataContractJsonSerializer一起使用,您可以稍微修改它以获得:

using System;
using System.Collections.Generic;
using System.Globalization;

namespace YourApp
{
    [DataContract]
    public class Ev
    {
        [DataMember(Name = "events")]
        public IList<Event> Events { get; set; }
    }

    [DataContract]
    public class Event
    {
        [DataMember(Name ="id")]
        public string Id { get; set; }

        [DataMember(Name ="timestamp")]
        public DateTimeOffset Timestamp { get; set; }

        [DataMember(Name ="action")]
        public string Action { get; set; }

        [DataMember(Name ="target")]
        public Target Target { get; set; }

        [DataMember(Name ="request")]
        public Request Request { get; set; }

        [DataMember(Name ="actor")]
        public object Actor { get; set; }

        [DataMember(Name ="source")]
        public Source Source { get; set; }
    }

    [DataContract]
    public class Request
    {
        [DataMember(Name ="id")]
        public string Id { get; set; }

        [DataMember(Name = "addr")]
        public string Addr { get; set; }

        [DataMember(Name = "host")]
        public string Host { get; set; }

        [DataMember(Name = "method")]
        public string Method { get; set; }

        [DataMember(Name = "useragent")]
        public string Useragent { get; set; }
    }

    [DataContract]
    public class Source
    {
        [DataMember(Name = "addr")]
        public string Addr { get; set; }

        [DataMember(Name = "instanceID")]
        public string InstanceId { get; set; }
    }

    [DataContract]
    public class Target
    {
        [DataMember(Name = "mediaType")]
        public string MediaType { get; set; }

        [DataMember(Name = "size")]
        public long Size { get; set; }

        [DataMember(Name = "digest")]
        public string Digest { get; set; }

        [DataMember(Name = "length")]
        public long Length { get; set; }

        [DataMember(Name = "repository")]
        public string Repository { get; set; }

        [DataMember(Name = "url")]
        public string Url { get; set; }

        [DataMember(Name = "tag")]
        public string Tag { get; set; }
    }
}
使用系统;
使用System.Collections.Generic;
利用制度全球化;
名称空间YourApp
{
[数据合同]
公共级电动汽车
{
[DataMember(Name=“events”)]
公共IList事件{get;set;}
}
[数据合同]
公开课活动
{
[数据成员(Name=“id”)]
公共字符串Id{get;set;}
[DataMember(Name=“timestamp”)]
公共DateTimeOffset时间戳{get;set;}
[DataMember(Name=“action”)]
公共字符串操作{get;set;}
[DataMember(Name=“target”)]
公共目标目标{get;set;}
[DataMember(Name=“request”)]
公共请求请求{get;set;}
[DataMember(Name=“actor”)]
公共对象参与者{get;set;}
[DataMember(Name=“source”)]
公共源{get;set;}
}
[数据合同]
公共类请求
{
[数据成员(Name=“id”)]
公共字符串Id{get;set;}
[数据成员(Name=“addr”)]
公共字符串Addr{get;set;}
[DataMember(Name=“host”)]
公共字符串主机{get;set;}
[DataMember(Name=“method”)]
公共字符串方法{get;set;}
[DataMember(Name=“useragent”)]
公共字符串用户代理{get;set;}
}
[数据合同]
公共类源
{
[数据成员(Name=“addr”)]
公共字符串Addr{get;set;}
[DataMember(Name=“instanceID”)]
公共字符串InstanceId{get;set;}
}
[数据合同]
公共类目标
{
[DataMember(Name=“mediaType”)]
公共字符串媒体类型{get;set;}
[DataMember(Name=“size”)]
公共长大小{get;set;}
[DataMember(Name=“digest”)]
公共字符串摘要{get;set;}
[DataMember(Name=“length”)]
公共长长度{get;set;}
[DataMember(Name=“repository”)]
公共字符串存储库{get;set;}
[DataMember(Name=“url”)]
公共字符串Url{get;set;}
[DataMember(Name=“tag”)]
公共字符串标记{get;set;}
}
}

看看这个类是否有效。

如果您能提供一个(我们可以复制并粘贴int)的
using System;
using System.Collections.Generic;
using System.Globalization;

namespace YourApp
{
    [DataContract]
    public class Ev
    {
        [DataMember(Name = "events")]
        public IList<Event> Events { get; set; }
    }

    [DataContract]
    public class Event
    {
        [DataMember(Name ="id")]
        public string Id { get; set; }

        [DataMember(Name ="timestamp")]
        public DateTimeOffset Timestamp { get; set; }

        [DataMember(Name ="action")]
        public string Action { get; set; }

        [DataMember(Name ="target")]
        public Target Target { get; set; }

        [DataMember(Name ="request")]
        public Request Request { get; set; }

        [DataMember(Name ="actor")]
        public object Actor { get; set; }

        [DataMember(Name ="source")]
        public Source Source { get; set; }
    }

    [DataContract]
    public class Request
    {
        [DataMember(Name ="id")]
        public string Id { get; set; }

        [DataMember(Name = "addr")]
        public string Addr { get; set; }

        [DataMember(Name = "host")]
        public string Host { get; set; }

        [DataMember(Name = "method")]
        public string Method { get; set; }

        [DataMember(Name = "useragent")]
        public string Useragent { get; set; }
    }

    [DataContract]
    public class Source
    {
        [DataMember(Name = "addr")]
        public string Addr { get; set; }

        [DataMember(Name = "instanceID")]
        public string InstanceId { get; set; }
    }

    [DataContract]
    public class Target
    {
        [DataMember(Name = "mediaType")]
        public string MediaType { get; set; }

        [DataMember(Name = "size")]
        public long Size { get; set; }

        [DataMember(Name = "digest")]
        public string Digest { get; set; }

        [DataMember(Name = "length")]
        public long Length { get; set; }

        [DataMember(Name = "repository")]
        public string Repository { get; set; }

        [DataMember(Name = "url")]
        public string Url { get; set; }

        [DataMember(Name = "tag")]
        public string Tag { get; set; }
    }
}