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

Using ServiceStack Client with Case Sensitive REST Service

我的代码在响应 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 指出:

As for ServiceStack's JSON Serializer, in the latest release - the properties are case-insensitive...

所以如果不是很明显的问题,有没有办法处理区分大小写的名称。希望它只是一个我需要设置的配置选项或一些简单的东西。

您可以将 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

ServiceStack.Text Json Serailizer 属性不区分大小写,因此您需要使用字典来捕获具有不同名称的属性,例如:

class ApiResponse
{
    public Dictionary<string,string> Results { get; set; }
}

或者,您可以使用 HTTP Utils to consume the 3rd Party API then parse the adhoc JSON with JS Utils 将其反序列化为适当的集合类型,并保留返回的类型,例如:

string json = url.GetJsonFromUrl();
var obj = (Dictionary<string,object>)JSON.parse(json);

obj["T"] //= "ABCD"
obj["t"] //= 1625874938819163000