C# J定制媒体类型的序列化,赢得数据';不能反序列化
嘿,我正在尝试反序列化一些服务发送到我的端点的json流。 问题是此服务使用自定义媒体类型向我发送数据,该媒体类型为: application/vnd.docker.distribution.manifest.v2+json 例如,我从内存stram中捕获并保存在文件中的流: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-
{
"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; }
}
}