【问题标题】:Remove attributes from a JSON string before deserializing在反序列化之前从 JSON 字符串中删除属性
【发布时间】:2012-12-13 07:59:06
【问题描述】:

我正在调用的 Web 服务返回一个 JSON 响应,其中包含比我实际需要使用的更多的数据,这导致反序列化过程需要很长时间。

我正在使用 VB.NET 和 Newtonsoft JSON 库。

以下面的 JSON 为例,如何删除除 'id' 值之外的所有值?

{"results": [
  {"id":"1234", "name":"name value", "logo":"<some base64 encoded string>"},
  {"id":"1234", "name":"name value", "logo":"<some base64 encoded string>"},
  {"id":"1234", "name":"name value", "logo":"<some base64 encoded string>"},
  {"id":"1234", "name":"name value", "logo":"<some base64 encoded string>"},
  {"id":"1234", "name":"name value", "logo":"<some base64 encoded string>"}
]}

正则表达式会是最好的方法吗?

我刚刚了解到它还需要处理嵌套的对象数组,这些对象也具有id 属性。嵌套的 id 属性应从最终 JSON 中排除。

{"results": [
  {"id":"1234", "name":"name value", "categories":[{"id":"1","name":"category"}]},
  {"id":"1234", "name":"name value", "categories":[{"id":"1","name":"category"}]},
  {"id":"1234", "name":"name value", "categories":[{"id":"1","name":"category"}]},
  {"id":"1234", "name":"name value", "categories":[{"id":"1","name":"category"}]},
  {"id":"1234", "name":"name value", "categories":[{"id":"1","name":"category"}]}
]}

【问题讨论】:

  • 不,正则表达式可能不是解决方案,它无法解析 JSON 或正确删除某些内容。相反,去找一些你可以挂钩或允许延迟评估的解析器。

标签: regex json .net-2.0


【解决方案1】:

您可以使用以下表达式

(?<="id":")[0-9]*(?=")

获取 ID,然后使用 for / foreach 循环和 StringBuilder 构建您的 JSON 字符串。

我将发布一个使用 C# 的示例用法,也许您可​​以将其改编为 VB:

var json = "{\"results\": [" +
"{\"id\":\"1234\", \"name\":\"name value\", \"logo\":\"<some base64 encoded string>\"}," +
"{\"id\":\"1234\", \"name\":\"name value\", \"logo\":\"<some base64 encoded string>\"}," +
"{\"id\":\"1234\", \"name\":\"name value\", \"logo\":\"<some base64 encoded string>\"}," +
"{\"id\":\"1234\", \"name\":\"name value\", \"logo\":\"<some base64 encoded string>\"}," +
"{\"id\":\"1234\", \"name\":\"name value\", \"logo\":\"<some base64 encoded string>\"}" +
"]}";

//try to get matches when JSON contains categories
MatchCollection matches = Regex.Matches(json, "(?<=\"id\":\")[0-9]*(?=\", \"name\":\".*\", \"categories\")");

//if no matches are present (i.e. categories are not included in the JSON)
if(matches.Count==0)
    matches = Regex.Matches(json, "(?<=\"id\":\")[0-9]*(?=\")");

StringBuilder sBuilder = new StringBuilder();
sBuilder.Append("{\"results\": [");

for (int i = 0; i < matches.Count; i++)
{
    sBuilder.Append("{\"id\":\"");
    sBuilder.Append(matches[i].Value);
    if (i == matches.Count - 1)
        break;
    sBuilder.Append("\"},");
}

sBuilder.Append("\"}]}");

//use the JSON string
//sBuilder.ToString();

【讨论】:

  • 这看起来是一个不错的解决方案。它会支持我刚刚添加的其他示例 JSON 吗?我怀疑在使用现有代码之前我需要使用正则表达式来删除“类别”数组。
【解决方案2】:

正如here 解释的那样,JSON 不是常规语言,因此使用正则表达式并不是实现目标的最佳方式(尽管也许可以做到)。使用您的解析器进行这种操作要好得多。

我认为使用 JSON.NET,对于选择项目,您可以执行以下操作:

var ids = response["results"].Children()["id"]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-05-08
    • 2016-04-16
    • 1970-01-01
    • 1970-01-01
    • 2013-07-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多