反序列化格式错误的结果

Deserializing a badly formed result

我正在制作一个 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,否则我不能这样做,因此我需要从请求时的列表中获取它 return s 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 以获得很好的反序列化具体 class。基本上拖网 JSON 直到我找到可以反序列化到我的目标 class.

的东西

第二次尝试

在重构第一次尝试(并将我的序列化器与 JSON.Net 解耦)后,我决定通过 RESTRequest 本身传入一个自定义序列化器(比如 SomeClassSerializer),所以在 大多数情况我可以使用基本的JSON <--> Concrete版本,当我需要的时候我可以用这个特定的版本覆盖它。

我的实际问题是:

  1. 难道只有我一个人认为这个 JSON 的反应是一团糟吗?他们在想什么?!
  2. 有没有更好的方法来处理这个问题(在 JSON.Net 或不在)...因为对象的名称是整数(恰好是 ID)我不能完全return 他们是 IEnumerable<TWeirdType>.

欢迎任何帮助。

它比我最初想象的要简单得多(也更明显)...我想要一个可以使我的 RESTClient 和 JSON.Net 松散耦合的解决方案,我可以做到这一点使用 JsonConverter(它是 JSON.Net 的一部分,但逻辑在我的客户之外,所有这些都是通过类型发生的)。

我得到的是:

public interface IMySerializer
{
    string Serialize<T>(T target);
    T Deserialize<T>(string json);
}

我的 RESTClient 使用具体类型 BasicJsonSerializer(里面有 JSON.Net 的序列化程序)和这个自定义转换器(通过 JsonSerializerSettings).

public IEnumerableSomeClassConverter : JsonConverter
{
    public override bool CanConvert(Type objectType) {}

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        // Handle the weirdness here and return my IEnumerable
    }

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) {}
}

处理得很好