从 JSON 对象中删除"Integer"属性?



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-NEST的属性。

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

您必须调整(并检查)以满足您的需求,但此方法将从JSON字符串中剥离整数。

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

一种清洁的方法可能是将其写入扩展方法。

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);

这是解决方案:

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的答案(我没有尝试)。

相关内容

  • 没有找到相关文章

最新更新