/
ResourceListConverter.cs
67 lines (56 loc) · 2.13 KB
/
ResourceListConverter.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
using System;
using System.Linq;
using Newtonsoft.Json;
using WebApi.Hal.Interfaces;
namespace WebApi.Hal.JsonConverters
{
public class ResourceListConverter : JsonConverter
{
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
var list = (IRepresentationList)value;
list.Links.Add(new Link
{
Rel = "self",
Href = list.Href
});
writer.WriteStartObject();
writer.WritePropertyName("_links");
serializer.Serialize(writer, list.Links);
writer.WritePropertyName("_embedded");
writer.WriteStartObject();
writer.WritePropertyName(list.Rel);
writer.WriteStartArray();
foreach (Representation halResource in list)
{
serializer.Serialize(writer, halResource);
}
writer.WriteEndArray();
writer.WriteEndObject();
var listType = list.GetType();
var propertyInfos = typeof(RepresentationList<>).GetProperties().Select(p => p.Name);
foreach (var property in listType.GetProperties().Where(p => !propertyInfos.Contains(p.Name)))
{
writer.WritePropertyName(property.Name.ToLower());
serializer.Serialize(writer, property.GetValue(value, null));
}
writer.WriteEndObject();
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
return reader.Value;
}
public override bool CanConvert(Type objectType)
{
return IsResource(objectType) && IsResourceList(objectType);
}
static bool IsResourceList(Type objectType)
{
return typeof(IRepresentationList).IsAssignableFrom(objectType);
}
static bool IsResource(Type objectType)
{
return typeof(Representation).IsAssignableFrom(objectType);
}
}
}