首页 > 解决方案 > 使用 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”的值。

我有两个问题:

  1. 如何在没有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>();
      }
    }
}
  1. 假设我确实想使用强类型。考虑到期间的存在,我该怎么做top.level?考虑到我忽略mykey2和,我会创建什么类型定义another.top.level

我也愿意在不使用 Json.NET 的情况下使用任何 .NET 的内置序列化机制来做这两件事,因此欢迎所有想法和建议。谢谢!

标签: c#jsonserializationjson.netdeserialization

解决方案


您可以使用 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;

推荐阅读