将 ServiceStack 客户端与区分大小写的 REST 服务一起使用

Posted

技术标签:

【中文标题】将 ServiceStack 客户端与区分大小写的 REST 服务一起使用【英文标题】:Using ServiceStack Client with Case Sensitive REST Service 【发布时间】:2021-09-20 05:30:54 【问题描述】:

我的代码在响应 DTO 中使用了 DataContractDataMember 我正在尝试通过此响应使用 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 的客户端代码之间的主要区别吗? [关闭]

ServiceStack:添加 Blazor 支持?

十三Nginx Location

mysql数据查询分不分大小写

ServiceStack Json Serializer 忽略属性

如何使用 servicestack 类型的客户端?