有一个问题,我的 json 数据看起来正确,好像它应该能够反序列化为一个对象,但事实并非如此。而且,不幸的是,我只在生产中遇到了这个问题。在开发中,使用完全相同的数据,它工作正常。
更新 1 我终于发现服务器之间在如何序列化对象属性名称方面存在差异,我认为这是问题所在,但我不确定为什么一台服务器与另一台服务器的行为不同(即似乎它是一个网络.config 设置...但我找不到)。
区别如下:
JObject jsonObject = JObject.Parse(shopifyResponse);
JToken jExtension = jsonObject.SelectToken("extensions");
_logger.Debug($"DelayNextGraphQLQueryCall: extensions: {jExtension}.");
输出这个,这是正确的,和camelCase
,它匹配我的对象的属性名称:
{
"cost":{
"requestedQueryCost":996,
"actualQueryCost":992,
"throttleStatus":{
"maximumAvailable":2000.0,
"currentlyAvailable":1008,
"restoreRate":100.0
}
}
}
但是,这就是差异发挥作用的地方:
queryCost = jExtension.ToObject<BaseGraphQLResponse.GraphExtensions>();
_logger.Debug($"DelayNextGraphQLQueryCall: queryCost: {JsonConvert.SerializeObject(queryCost)}.");
在我的开发服务器上输出:
{
"cost":{
"requestedQueryCost":996,
"actualQueryCost":996,
"throttleStatus":{
"maximumAvailable":2000,
"currentlyAvailable":573,
"restoreRate":100
}
}
}
但这在我们的生产服务器上(注意它是 snake_case
并且属性值不正确并且 throttle_status
为空):
{
"cost":{
"requested_query_cost":0,
"actual_query_cost":0,
"throttle_status":null
}
}
因此我在生产中的下一行出现 null object reference
错误,但在开发中没有:
int pointsBalance = queryCost.Cost.ThrottleStatus.CurrentlyAvailable;
问题:
[JsonObject(NamingStrategyType = typeof(CamelCaseNamingStrategy))]
。但我更愿意了解服务器级别的设置,如果可能的话,不必将其全部放在我的代码中。正在解析的原始响应:
{
"data":{
"inventoryUpdateResult0":{
"inventoryLevel":{
"location":{
"name":"test"
},
"item":{
"id":"gid:\/\/shopify\/InventoryItem\/4015709785314454",
"sku":"t3012"
},
"available":275
},
"userErrors":[
]
},
"inventoryUpdateResult1":{
"inventoryLevel":{
"location":{
"name":"test"
},
"item":{
"id":"gid:\/\/shopify\/InventoryItem\/4015709791864444",
"sku":"t3014"
},
"available":753
},
"userErrors":[
]
},
.....
},
"extensions":{
"cost":{
"requestedQueryCost":996,
"actualQueryCost":992,
"throttleStatus":{
"maximumAvailable":2000.0,
"currentlyAvailable":1008,
"restoreRate":100.0
}
}
}
}
这里是类定义:
public class InventoryUpdateResult
{
[JsonProperty("inventoryLevel")]
public InventoryLevel InventoryLevel { get; set; }
[JsonProperty("userErrors")]
public UserError[] UserErrors { get; set; }
}
public class InventoryLevel
{
[JsonProperty("location")]
public ShopifyLocation Location { get; set; }
[JsonProperty("item")]
public ShopifyItem Item { get; set; }
[JsonProperty("available")]
public decimal Available { get; set; }
}
public class ShopifyLocation
{
[JsonProperty("name")]
public string Name { get; set; }
}
public class ShopifyItem
{
[JsonProperty("id")]
public string Id { get; set; }
[JsonProperty("sku")]
public string Sku { get; set; }
}
public class UserError
{
[JsonProperty("field")]
public string[] Field { get; set; }
[JsonProperty("message")]
public string Message { get; set; }
}