反序列化格式错误的结果
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
版本,当我需要的时候我可以用这个特定的版本覆盖它。
我的实际问题是:
- 难道只有我一个人认为这个 JSON 的反应是一团糟吗?他们在想什么?!
- 有没有更好的方法来处理这个问题(在 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) {}
}
处理得很好
我正在制作一个 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
版本,当我需要的时候我可以用这个特定的版本覆盖它。
我的实际问题是:
- 难道只有我一个人认为这个 JSON 的反应是一团糟吗?他们在想什么?!
- 有没有更好的方法来处理这个问题(在 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) {}
}
处理得很好