反序列化结果错误的结果

时间:2015-09-01 13:21:55

标签: json-deserialization

我正在制作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版本,当我需要时,我可以用这个特定的版本覆盖它。

我的实际问题是:

  1. 我是否一个人认为这个特殊的JSON响应只是一个可怕的混乱?他们在想什么?!
  2. 有没有更好的方法来处理这个问题(无论是在JSON.Net中还是没有)...因为对象的名称是整数(恰好是ID)我无法准确地返回它们为IEnumerable<TWeirdType>
  3. 欢呼任何帮助。

1 个答案:

答案 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

处理得很好。