反序列化递归 JSON 对象

Aki*_*kis 1 c# recursion serialization json json.net

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

{
  "where": {
    "operator": "AND",
    "left": {
      "operator": "=",
      "$fieldRef": "requestor",
      "value": "@me"
    },
    "right": {
      "operator": "=",
      "$fieldRef": "state",
      "value": "Closed"
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

更多对象也可以出现在 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"
        }
      }
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

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

Bri*_*ers 5

像这样定义类:

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; }
}
Run Code Online (Sandbox Code Playgroud)

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

Query q = JsonConvert.DeserializeObject<Query>(json);
Run Code Online (Sandbox Code Playgroud)

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

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

json = JsonConvert.SerializeObject(q, settings);
Run Code Online (Sandbox Code Playgroud)

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