【问题标题】:Deserialize recursive JSON object [closed]反序列化递归 JSON 对象 [关闭]
【发布时间】:2016-09-05 09:16:44
【问题描述】:

我有一个像这样表示查询表达式的递归 JSON 对象:

{
  "where": {
    "operator": "AND",
    "left": {
      "operator": "=",
      "$fieldRef": "requestor",
      "value": "@me"
    },
    "right": {
      "operator": "=",
      "$fieldRef": "state",
      "value": "Closed"
    }
  }
}

更多对象也可以出现在 JSON 层次结构中。这是一个更复杂的例子:

{
  "where": {
    "operator": "OR",
    "left": {
      "operator": "=",
      "$fieldRef": "id",
      "value": "1234"
    },
    "right": {
      "operator": "OR",
      "left": {
        "operator": "=",
        "$fieldRef": "orgId",
        "value": "6757"
      },
      "right": {
        "operator": "AND",
        "left": {
          "operator": "STARTSWITH",
          "$fieldRef": "firstname",
          "value": "D"
        },
        "right": {
          "operator": "=",
          "$fieldRef": "state",
          "value": "Closed"
        }
      }
    }
  }
}

我希望能够将此 JSON 反序列化为一些类,更新数据,然后再序列化回 JSON。如何使用 Json.NET 做到这一点?

【问题讨论】:

  • 你试过什么?你用json.net 标记了这个问题,这几乎是序列化/反序列化 JSON 的标准。也许用那个?
  • 我正在尝试使用 mvvm 模式构建一个 wpf 应用程序,想递归地反序列化 json 文件..
  • 在这里,我会为您搜索“json .net 反序列化”:newtonsoft.com/json/help/html/deserializeobject.htm(注意:您不会“递归反序列化”。您只需反序列化为一个可以容纳它的对象结构。定义你的类,使用json.net中的一行代码将JSON字符串反序列化为该类。)
  • “递归 json”对你意味着什么?
  • 对象层级结构......n次

标签: c# json recursion serialization json.net


【解决方案1】:

像这样定义类:

class Query
{
    [JsonProperty("where")]
    public Clause Where { get; set; }
}

class Clause
{
    [JsonProperty("operator")]
    public string Operator { get; set; }

    [JsonProperty("left")]
    public Clause Left { get; set; }

    [JsonProperty("right")]
    public Clause Right { get; set; }

    [JsonProperty("$fieldref")]
    public string FieldRef { get; set; }

    [JsonProperty("value")]
    public string Value { get; set; }
}

然后你可以像这样反序列化:

Query q = JsonConvert.DeserializeObject<Query>(json);

您可以像这样序列化回 JSON:

JsonSerializerSettings settings = new JsonSerializerSettings
{
    NullValueHandling = NullValueHandling.Ignore,
    Formatting = Formatting.Indented
};

json = JsonConvert.SerializeObject(q, settings);

这里是一个简单的演示:https://dotnetfiddle.net/qqAj2v

【讨论】:

  • 哦..看起来很有帮助..谢谢大脑..
  • 它工作正常...请告诉我如何在可观察集合中收集递归数据?我的意思是我需要绑定到 UI 的子句列表。
  • 我无法在评论区回答这个问题。我建议为此打开一个新问题。在那个问题中,详细解释你想要完成什么,到目前为止你做了什么(如果可能的话包括代码),你有什么想法,以及你遇到了什么问题。如果您想提供上下文,可以链接回此问题。
  • 我无法提出新问题,因为我已被阻止!实际上,我将使用 MVVM 在 WPF(XAML) 中创建类似 TFS 的工作项。现在我需要映射您建议的查询。变量“q”包含我预期的数据,但它包含递归“左”和“右”。这些数据需要映射并存储在可观察的集合中,以便我可以将它们绑定到 XAML 中。
猜你喜欢
  • 2018-10-03
  • 1970-01-01
  • 2021-06-24
  • 2014-06-10
  • 1970-01-01
  • 2014-07-24
  • 2015-02-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多