如何允许 JObject 的可配置反序列化?

How to allow configurable deserialization of JObject?

在 .NET Core 控制台应用程序中,我正在调用 returns JSON 的 REST API。我将 Newtonsoft.Json.Linq.JObject 用于 deserialization/retrieval 值,如下所示:

string responseJson = await Utils.GetJsonFromApi(apiEndpoint);
dynamic jObject = new Newtonsoft.Json.Linq.JObject();
jObject = NewtonSoft.Json.JsonConvert.DeserializeObject(responseJson);
foreach (var car in jObject.items)
{
    string carId = car.id.ToString();
}

如果 API 开发人员将数组变量 items 更改为 list 或将变量 id 更改为 code,我将不得不更新我的代码和 recompile/republish.

是否可以像这样以某种方式利用应用程序设置:

"carAPI":{
    "uri": "someuri",
    "itemsArrayVariable": "items",
    "carIdVariable": "id" 
}

并在我的 API 客户端中使用这些设置,如下所示:

foreach (var car in jObject.itemsArrayVariable)
{
    string carId = car.carIdVariable.ToString();
}

反序列化为 Dictionary<string, JToken> 并以递归方式深入研究您的数据。其他问答中记录了如何执行此操作。

但你不应该这样做,它会使你的代码无法维护。 API 开发人员不应进行此类重大更改,您也不应准备代码以防万一他们这样做。这就是 API 版本控制的目的。

如果他们要将数据移动到 JSON 中更深或更高的级别,则此解决方案也不会起作用,依此类推。无论如何你都必须重新编译,他们应该在另一个端点上做这样的改变,让老客户继续工作。