Эй, я пытаюсь десериализовать поток json, который какой-то сервис отправляет моей конечной точке.
Проблема в том, что эта служба отправляет мне данные с пользовательским типом носителя:
применение / vnd.docker.distribution.manifest.v2 + * JSON 1004 *
E.g поток, который я записываю из памяти, а затем сохраняю в файл:
{
"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; }
}
Мой метод десериализации, который я создал как новый InputFormatter
if (contentType == "application/vnd.docker.distribution.events.v1+json")
{
using (var ms = new MemoryStream(2048))
{
await request.Body.CopyToAsync(ms);
var content = ms.ToArray();
File.WriteAllBytes("test.txt", content);
ms.Position = 0;
try
{
DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(Ev));
Ev ev = (Ev) ser.ReadObject(ms);
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
return await InputFormatterResult.SuccessAsync(content);
}
}
Проблема в том, что свойство события ev равно null. Мне интересно, почему. Моя десериализация не инициирована должным образом?