c# - 使用 JSON.NET 解析 JSON 的最简洁方法,无需
问题描述
假设我有这个 JSON:
{
"top.level": {
"mykey": "3.301.0.97",
"mykey2": "not interested in this one"
},
"another.top.level": "not interested in this either"
}
我正在寻找使用 Json.NET 来解析这个字符串,并获取“mykey”的值。
我有两个问题:
- 如何在没有C# 强类型的情况下做到这一点,同时优雅地处理 JSON 没有
top.level
或的场景mykey
?我不想最终抛出 NullReferenceExceptions 或类似的东西。有比下面更优雅的答案吗?
string answer;
var jsonObj = JObject.Parse(jsonString);
if (jsonObj != null)
{
var topElement = jsonObj["top.level"];
if (topElement != null)
{
var keyElement = topElement["mykey"];
if (keyElement != null)
{
answer = keyElement.Value<string>();
}
}
}
- 假设我确实想使用强类型。考虑到期间的存在,我该怎么做
top.level
?考虑到我忽略mykey2
和,我会创建什么类型定义another.top.level
?
我也愿意在不使用 Json.NET 的情况下使用任何 .NET 的内置序列化机制来做这两件事,因此欢迎所有想法和建议。谢谢!
解决方案
您可以使用 null 传播使您的代码更具可读性。例如,以下代码可以替换您的示例:
var answer = jsonObj?["top.level"]?.Value<string>("myKey");
对于第二个问题,您可以使用JsonProperty
属性来定义属性的自定义名称。这可以代表您的示例:
public class Level2 { public string MyKey { get; set; } }
public class Level1
{
[JsonProperty("top.level")]
public Level2 TopLevel { get; set; }
}
现在,您可以使用以下代码反序列化:
var strongType = JsonConvert.DeserializeObject<Level1>(str);
var answer = strongType?.TopLevel?.MyKey;
推荐阅读
- c++ - 如何在商店中添加证书?
- python - __init_subclass__ 和描述符 __set_name__ 的顺序
- laravel - Heroku 上的 Laravel/Vue.js 应用程序和 MongoDB 部署错误
- django - django在模型中返回链接用户名
- xml - 我想从 XML 结构中删除重复节点
- jgroups - JGroups 启动导致消息爆,线程池满
- html - 为什么使用'focus-within'的按钮在iOS上不起作用
- powerbi - 通过 Power BI 服务共享时的 Power BI 数据集
- visual-studio - Ngrok 连接问题 X509 错误重新连接
- python - PyInstaller 无法创建可执行文件