从JSON对象中删除“整数”属性?

时间:2019-03-22 08:58:03

标签: c# json json.net

JSON对象:

{
   "Footer": "footer",
   "RowType": 4,
   "answers": [
      {
         "answer": 1,
         "FooterInner": "innerfooter"
      },
      {
         "answer": 2,
         "FooterInner": "innerfooter2"
      }
   ]
}

我需要从JSON中删除所有"integer"属性。 JSON对象可能每次都不同。因此,请考虑我们不知道属性键名称。

预期的JSON对象:

{
   "Footer": "",
   "answers": [
      {
         "FooterInner": "innerfooter"
      },
      {
         "FooterInner": "innerfooter2"
      }
   ]
}

上面的JSON对象只是一个例子。 JSON对象可能每次都不同(用户从UI上传JSON对象),并且我不预先知道JSON中的层次结构和键/属性名称。 JSON可能包含N个嵌套的属性。

我尝试了很多事情,但是无法实现解决方案。有什么办法吗?

3 个答案:

答案 0 :(得分:0)

您必须根据需要调整(并检查)RegEx,但是此方法将从json字符串中去除整数。

        private string CleanJson(string json)
        {
            var regEx = new Regex("(\"\\w*\": \\d*,)");
            var jsonWithoutIntegers = regEx.Replace(json, string.Empty);

            return jsonWithoutIntegers;
        }

答案 1 :(得分:0)

一种更简洁的方法可能是将其编写为扩展方法。

public static class Extensions
{
    public static JToken RemoveFieldTypes(this JToken token,params JTokenType []fieldTypes)
    {
        JContainer container = token as JContainer;
        if (container == null) return token;

        var tokensToRemove = new List<JToken>();
        foreach (JToken el in container.Children())
        {
            JProperty p = el as JProperty;
            if(p!=null && fieldTypes.Contains(p.Value.Type))
            {
                tokensToRemove.Add(el);
            }
            el.RemoveFieldTypes(fieldTypes);
        }
        foreach (JToken el in tokensToRemove)
        {
            el.Remove();
        }
        return token;
    }
}

现在您可以执行以下操作。

JToken nodeList = JToken.Parse(strJson);
nodeList.RemoveFieldTypes(JTokenType.Integer);

答案 2 :(得分:0)

这是解决方案:

static void Main(string[] args)
{
    var json =
        @"{
           ""Footer"": ""footer"",
                ""RowType"": 4,
                ""answers"": 
                [
                    {
                        ""answer"": 1,
                        ""FooterInner"": ""innerfooter""
                    },
                    {
                        ""answer"": 2,
                        ""FooterInner"": ""innerfooter2""
                    }
                ]
            }";
    JToken nodeList = JToken.Parse(json);
    List<JTokenType> typesToRemove = new List<JTokenType>(){JTokenType.Boolean, JTokenType.Float, JTokenType.Integer};

    removeFields(nodeList, typesToRemove);

    Console.WriteLine(nodeList.ToString());
    Console.ReadKey();
}

private static void removeFields(JToken token, List<JTokenType> typesToRemove)
{
    JContainer container = token as JContainer;
    if (container == null) return;

    List<JToken> removeList = new List<JToken>();
    foreach (JToken el in container.Children())
    {
        JProperty p = el as JProperty;
        if (p != null && typesToRemove.Contains(p.Value.Type))
        {
            removeList.Add(el);
        }

        removeFields(el, typesToRemove);
    }

    foreach (JToken el in removeList)
    {
        el.Remove();
    }
}

我只是共享我的第一个工作代码,对于扩展方法解决方案,您可以使用@Anu Visman的答案(我没有尝试)。