我正在制作RESTful客户端(消费方),到目前为止,我的所有请求和响应都相当一致。我有这样的事情:
public class RESTClient
{
public T Execute<T>(RESTRequest request);
}
我的RESTRequest
包含基本URI,身份验证,资源URI和要序列化的任何对象。到目前为止一直很好,直到我遇到一种情况,结果无法反序列化为具体类型。该结果是例如SomeClass
的集合,其具有(在相同级别)集合中的结果数量。所以,让我们说SomeClass
看起来像这样:
public class SomeClass
{
public int Id { get; set; }
public string Name { get; set; }
}
如果我请求特定资源,那么它反序列化完全正常 - 但除非我有ID,否则我无法做到这一点,所以我需要从列表中获取它,当请求返回看起来像的JSON时这样:
{
"-1":
{
"id": -1,
"name": "There is *always* a -1 in the collection as default"
},
"3":
{
"id": 3,
"name": "This would be one I've added later"
},
"recordsCount": 2
}
因为你可以看到对象的ID是对象的名称......在同一级别,我们只有recordsCount
int
。
我的第一次尝试是(因为我正在使用JSON.Net)首先将结果作为JObject
检查,检查当前对象的名称是否与我的选择器匹配,然后再执行另一个请求通过ID获取SomeClass
以获得很好的反序列化的具体类。基本上是通过JSON拖网,直到找到可以反序列化到目标类的东西。
重构第一次尝试(并将我的序列化程序与JSON.Net解耦)后,我决定通过SomeClassSerializer
本身传递一个自定义序列化程序(比如RESTRequest
),所以 most < / em> case我可以使用基本的JSON <--> Concrete
版本,当我需要时,我可以用这个特定的版本覆盖它。
我的实际问题是:
IEnumerable<TWeirdType>
。欢呼任何帮助。
答案 0 :(得分:0)
它比我最初想的要简单得多(而且更明显)......我想要一个能让我的RESTClient
和JSON.Net松散耦合的解决方案,我可以用{{1 (这是JSON.Net的一部分,但逻辑在我的客户端之外,所有都是通过类型发生的。)
我所得到的是:
JsonConverter
我的public interface IMySerializer
{
string Serialize<T>(T target);
T Deserialize<T>(string json);
}
使用了具体类型RESTClient
(其中包含JSON.Net的序列化程序)和此自定义转换器(通过BasicJsonSerializer
传递)
JsonSerializerSettings
处理得很好。