簡體   English   中英

從 JSON 對象中刪除“整數”屬性?

[英]Remove "Integer" properties from JSON Object?

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 嵌套屬性。

我嘗試了很多東西,但無法實現解決方案。 有什么辦法嗎?

您必須根據需要調整(並檢查)正則表達式,但此方法將從 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 的答案(我沒有嘗試過)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM