将 ServiceStack 客户端与区分大小写的 REST 服务一起使用
Posted
技术标签:
【中文标题】将 ServiceStack 客户端与区分大小写的 REST 服务一起使用【英文标题】:Using ServiceStack Client with Case Sensitive REST Service 【发布时间】:2021-09-20 05:30:54 【问题描述】:我的代码在响应 DTO 中使用了 DataContract
和 DataMember
我正在尝试通过此响应使用 REST 服务,但它不起作用:
"results":
"p": 277.76,
"s": 1,
"x": 11,
"P": 34.95,
"S": 3,
"X": 51,
"z": 3,
"T": "ABCD",
"t": 1625874938819163000,
"y": 1625874938819148500,
"q": 55320377
,
"status": "OK",
"request_id": "e16e9db61563c8f675d5400f6c9fd8c9"
如您所见,名称区分大小写,我很确定这就是原因。我发现this article from 9+ years ago 指出:
至于 ServiceStack 的 JSON 序列化器,在最新版本中 - 属性不区分大小写...
所以问题如果不是很明显,是否有办法使用区分大小写的名称。希望它只是一个我需要设置的配置选项或一些简单的东西。
【问题讨论】:
【参考方案1】:ServiceStack.Text Json Serailizer 属性不区分大小写,因此您需要使用字典来捕获具有不同名称的属性,例如:
class ApiResponse
public Dictionary<string,string> Results get; set;
或者,您可以使用 HTTP Utils 使用 3rd Party API,然后使用 JS Utils 解析即席 JSON,这会将其反序列化为适当的集合类型并保留返回的类型,例如:
string json = url.GetJsonFromUrl();
var obj = (Dictionary<string,object>)JSON.parse(json);
obj["T"] //= "ABCD"
obj["t"] //= 1625874938819163000
【讨论】:
我确定这是您考虑过的问题,但请添加一个区分大小写的反序列化选项,因为尽管有可能 10 年后使用另一个反序列化器确实是唯一实用的解决方案。 @LorneCash 不会发生,不区分大小写的反序列化的原因是适应不良数据,这些数据在具有公共属性的类型化类中没有业务,因此无意通过添加附加选项来增加复杂性或性能成本.我的回答显示了处理不良数据的不同方法,否则您需要使用不同的序列化程序。【参考方案2】:您可以将 JSON 映射设置为不区分大小写,因此无论大小写如何,映射都会起作用
var options = new JsonSerializerOptions
PropertyNameCaseInsensitive = true
;
var weatherForecast = JsonSerializer.Deserialize<WeatherForecast>(jsonString, options);
https://docs.microsoft.com/en-us/dotnet/standard/serialization/system-text-json-character-casing
【讨论】:
我知道System.Text.Json
,我的问题是是否可以强制 ServiceStack 区分大小写,因为默认情况下它不是。以上是关于将 ServiceStack 客户端与区分大小写的 REST 服务一起使用的主要内容,如果未能解决你的问题,请参考以下文章
这些是 RestSharp 和 ServiceStack 的客户端代码之间的主要区别吗? [关闭]