【问题标题】:Editing JSON using JSONPath使用 JSONPath 编辑 JSON
【发布时间】:2016-03-04 14:53:46
【问题描述】:

你好 SO 社区 :)!

我想创建允许用户编辑(或添加)JSON 特定值或对象(由 JSONPath 位于 JSON 中)的方法。下面简单的例子是我的想法。用户总是输入 JSON、JSONPath 和值/对象来更改。我正在使用 Json.NET 库。

方法输入 {json, jsonpath, valuetoedit} || 输出 {new json as string}

示例输入:

{ "store": {
    "book": [ 
      { "category": "reference",
        "author": "Nigel Rees",
        "title": "Sayings of the Century",
        "price": 8.95
      },
      { "category": "fiction",
        "author": "Evelyn Waugh",
        "title": "Sword of Honour",
        "price": 12.99
      },
      { "category": "fiction",
        "author": "Herman Melville",
        "title": "Moby Dick",
        "isbn": "0-553-21311-3",
        "price": 8.99
      },
      { "category": "fiction",
        "author": "J. R. R. Tolkien",
        "title": "The Lord of the Rings",
        "isbn": "0-395-19395-8",
        "price": 22.99
      }
    ],
    "bicycle": {
      "color": "red",
      "price": 19.95
    }
  }
}

JSONPath 示例:

$.store.book[*].author

要更改的示例值:

NewAuthorSpecifiedByUser

输出 - 所有作者都将更改为“NewAuthorSpecifiedByUser”的新 JSON。

这可能吗?

【问题讨论】:

  • 采用code-first的方式,将JSON反序列化为对象图,修改对象图,然后再序列化回JSON不是更简单吗?特别是对于更大更复杂的 JSON,我认为更新为 POCO 比尝试通过路径更新 json 更快。我的意思是,你可以使用所有的 C#,而不是一些使用微不足道的 javascript 的开发人员(开玩笑)!

标签: c# json jsonpath


【解决方案1】:

第 3 方包 可以轻松完成此操作:

  1. 将 JSON 解析为由 JToken 令牌组成的 LINQ to JSON 层次结构。

  2. 使用JSONPath syntax 中的查询字符串通过SelectTokens 选择要修改的JSON 值。

  3. 使用 JToken.Replace() 将选定的值替换为新值。可以使用JToken.FromObject() 将新值直接序列化为JToken

因此:

public static class JsonExtensions
{
    public static JToken ReplacePath<T>(this JToken root, string path, T newValue)
    {
        if (root == null || path == null)
            throw new ArgumentNullException();

        foreach (var value in root.SelectTokens(path).ToList())
        {
            if (value == root)
                root = JToken.FromObject(newValue);
            else
                value.Replace(JToken.FromObject(newValue));
        }

        return root;
    }    

    public static string ReplacePath<T>(string jsonString, string path, T newValue)
    {
        return JToken.Parse(jsonString).ReplacePath(path, newValue).ToString();
    }    
}

然后像这样使用它:

var newJsonAuthorString = JsonExtensions.ReplacePath(jsonString, @"$.store.book[*].author", "NewAuthorSpecifiedByUser");

原型fiddle。如果您要允许用户进行一系列编辑,将 JSON 永久保存在 JToken 层次结构中可能会更有效,而不是反复转换字符串表示形式。

另见How to install JSON.NET using NuGet?

【讨论】:

  • 像魅力一样工作。非常感谢!
猜你喜欢
  • 2018-01-27
  • 2019-02-06
  • 1970-01-01
  • 2021-04-28
  • 2022-10-14
  • 2022-01-03
  • 2017-02-05
  • 1970-01-01
  • 2015-03-05
相关资源
最近更新 更多