仅生产服务器中的 Json 解析问题 - 蛇案例与骆驼案例

时间:2021-02-18 03:23:41

标签: c# json asp.net-mvc json.net

有一个问题,我的 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; }
}

0 个答案:

没有答案