如何将 JSON 中的值存储到键值对

本文关键字:存储 键值对 JSON | 更新日期: 2023-09-27 18:37:07

我正在尝试根据键值对中的节点从下面的 JSON 中获取值。我需要将 JSON 字段的值存储在列表或集合中。我尝试使用下面的代码,但它没有给出所需的输出。 我怎样才能做到这一点?

截至目前,我正在这样做:

HttpPostedFileBase JSfile = Request.Files["UploadedJSFile"];
if ((JSfile != null) && (JSfile.ContentLength > 0) && !string.IsNullOrEmpty(JSfile.FileName))
{
   BinaryReader b = new BinaryReader(JSfile.InputStream);
   byte[] binData = b.ReadBytes(JSfile.ContentLength);
   string result = System.Text.Encoding.UTF8.GetString(binData);
   JArray jsonVal = JArray.Parse(result) as JArray;
   foreach (JObject content in jsonVal.Children<JObject>())
   {
      foreach (JProperty prop in content.Properties())
      {
         filters.Add(prop.Name, prop.Value.ToString());
      }
   }
}

但它没有给出所需的输出。
我想要所有带有节点的值,例如:herobanner.landing.copies.watchvideo

这是我的 JSON:

[{
    "country": "en-in",
    "heroBanner": {
        "landing": {
            "copies": {
                "watchVideo": "watch the video",
                "scrollDown": [
                    "READ INSPIRING STORIES",
                    ""
                ],
                "banner": [
                    "make your",
                    "first move this",
                    "valentine's Day"
                ]
            },
            "background": {
                "desktop": "assets/images/millions-hero-1.jpg"
            },
            "foreground": {
                "desktop": ""
            },
            "video": {
                "youtubeId": "buwcDIcFR8I"
            }
        }
    }
}]

如何将 JSON 中的值存储到键值对

您可以创建一个递归扩展方法,将 JToken 层次结构扁平化为字典:

public static class JsonExtensions
{
    public static Dictionary<string, object> Flatten(this JToken token)
    {
        var dict = new Dictionary<string, object>();
        Flatten(token, dict);
        return dict;
    }
    private static void Flatten(JToken token, Dictionary<string, object> dict)
    {
        switch (token.Type)
        {
            case JTokenType.Object:
                foreach (JProperty prop in token.Children<JProperty>())
                {
                    Flatten(prop.Value, dict);
                }
                break;
            case JTokenType.Array:
                foreach (JToken child in token.Children())
                {
                    Flatten(child, dict);
                }
                break;
            default:
                dict.Add(token.Path, ((JValue)token).Value);
                break;
        }
    }
}

然后像这样使用它,假设jsonVal是某种类型的 JToken(例如 JArray 或 JObject):

var dict = jsonVal.Flatten();
foreach (var kvp in dict)
{
    Console.WriteLine(kvp.Key + ": " + kvp.Value);
}

小提琴:https://dotnetfiddle.net/sVrM2e