【问题标题】:Most concise way to parse JSON with JSON.NET, without使用 JSON.NET 解析 JSON 的最简洁方法,无需
【发布时间】:2020-01-08 22:52:20
【问题描述】:

假设我有这个 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.levelmykey 的场景?我不想最终抛出 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 中存在句点,我该怎么做?考虑到我忽略了mykey2another.top.level,我会创建什么类型定义?

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

【问题讨论】:

  • “优雅”是什么意思?如果您的示例感觉太混乱,请将其隐藏在方法中。
  • 你也可以试试jsonObj["top.level"]?.topElement["mykey"]?.Value&lt;string&gt;();

标签: c# json serialization json.net deserialization


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-08
    • 2010-09-28
    • 1970-01-01
    • 2016-03-06
    • 1970-01-01
    • 2017-07-23
    相关资源
    最近更新 更多