如何在C#中将JSON元素名称和值推入字典

y3bcpkx1  于 2023-10-21  发布在  C#
关注(0)|答案(2)|浏览(149)

我正在处理一个Json对象,它具有先验的部分未知结构。我不确定我是否可以使用命名对象方法,因为我无法预测我希望目标的确切结构长度和命名。
我只知道结构 backbone (查看Json预览器)将是这样的:

[JSON]
    [meta] 
        metaname1: metavalue1
        ...
        metanameN: metavalueN
    [target]
        [0]
            targetname1: targetvalue1
            ...
            targetnameP: targetvalueP

实际提取的结构如下:

{[meta, {
  "limit": 100,
  "offset": 0,
  "count": 1,
  "total": 1
}]}
{[target, [
  {
    "open": 173.99,
    "high": 175.46,
    "low": 172.675,
    "last": 175.38,
    "close": 173.66,
    "volume": 607334.0,
    "date": "2023-10-05T21:00:00+02:00",
    "symbol": "AAPL",
    "exchange": "IEXG"
  }
]]}

我想跳过'Meta'节点,专注于'target'节点,并将一系列键和值(targetname1,targetvalue1),.,(targetnameP,targetvalueP)推入字典。我已经加载了Json对象使用Newtonsoft.Json库后,阅读数据从互联网上在一个给定的“地址”。

using (HttpClient client = new HttpClient())
{
    Task<HttpResponseMessage> response = client.GetAsync(address);
    using (HttpResponseMessage message = response.Result)
    {
        using (HttpContent content = message.Content)
        {
            string jsonData = content.ReadAsStringAsync().Result;
            JObject jsonObj = JObject.Parse(jsonData);
        }
    }
}

我不知道下一步如何进行。

增编

现在我正在尝试,但我仍然被卡住了。

class Program
{
    static void Main(string[] args)
    {
        string jsonData = @"
            {[meta, {
               "limit": 100,
               "offset": 0,
               "count": 1,
               "total": 1
            }]}
            {[target, [
              {
                "open": 173.99,
                "high": 175.46,
                "low": 172.675,
                "last": 175.38,
                "close": 173.66,
                "volume": 607334.0,
                "date": "2023-10-05T21:00:00+02:00",
                "symbol": "AAPL",
                "exchange": "IEXG"
              }
            ]]}";

        Dictionary<string, object> jsonDict = JsonConvert.DeserializeObject<Dictionary<string, object>>(jsonData);
        object jsonSubData = jsonDict["target"];
    }
}

我无法将'jsonSubData'放入另一个字典。

这是一个有效的解决方案吗?

我想到了这个。似乎有用。我不确定这是最有效的解决方案。

class Program
{
    static void Main(string[] args)
    {
        string jsonData = @"Same structure as before";

        JObject jsonObj = JObject.Parse(jsonData);
        JObject jsonSubObj = jsonObj["data"].Values<JObject>().First();

        Dictionary<string, string> jsonDict = new Dictionary<string, string>();
        foreach (JProperty property in jsonSubObj.Properties())
            jsonDict.Add(property.Name, property.Value.ToString());
    }
}
7ajki6be

7ajki6be1#

我假设json根目录总是包含metatarget属性。如果是这样,你可以这样做:

public sealed class DataContainer
{
    [JsonProperty("meta")]
    public Dictionary<string, object>? Meta { get; set; }

    [JsonProperty("target")]
    public Dictionary<string, object>[]? Data { get; set; }
}

然后你就这么做

string json = @"{""meta"":{""limit"":100,""offset"":0,""count"":1,""total"":1},""target"":[{""open"":173.99,""high"":175.46,""low"":172.675,""last"":175.38,""close"":173.66,""volume"":607334.0,""date"":""2023-10-05T21:00:00+02:00"",""symbol"":""AAPL"",""exchange"":""IEXG""}]}";

DataContainer? data = JsonConvert.DeserializeObject<DataContainer>(json);

现在你可以访问Data属性,并覆盖它的所有元素(对象)。
如果你使用的是System.Text.Json,那么你只需要修改以下内容:

JsonPropertyAttribute         -> JsonPropertyNameAttribute 
JsonConvert.DeserializeObject -> JsonSerializer.Deserialize

如果你的json root有比上面例子更多的键,并且你只需要target,那么你可以省略Meta属性,然后使用JsonSerializerSettings并将MissingMemberHandling设置为MissingMemberHandling.Ignore,这将确保你只对DataContainer类中提供的任何东西进行格式化。

hec6srdp

hec6srdp2#

在C#中,可以使用Newtonsoft.JSON库解析JSON,并将元素名称和值推送到字典中。下面是一个示例:
C#语言
这段代码是AI生成的。仔细阅读和使用。请访问我们的常见问题解答了解更多信息。

using Newtonsoft.Json;
using System.Collections.Generic;

public class Program
{
    public static void Main()
    {
        string json = @"{
            'Name': 'John Smith',
            'Age': 30,
            'City': 'New York'
        }";

        Dictionary<string, string> values = JsonConvert.DeserializeObject<Dictionary<string, string>>(json);

        foreach (var item in values)
        {
            System.Console.WriteLine("Key: {0}, Value: {1}", item.Key, item.Value);
        }
    }
}

在这段代码中:
首先定义一个JSON字符串json。然后我们使用JsonConvert.DeserializeObject<Dictionary<string, string>>(json)将JSON字符串转换为字典。最后,我们打印出字典的键和值。请注意,您需要安装Newtonsoft.json包。您可以通过在Visual Studio中使用NuGet包管理器或在包管理器控制台中运行以下命令来执行此操作:

Install-Package Newtonsoft.Json

这段代码假设JSON中的所有值都是字符串。如果你的JSON包含不同的类型(例如,数字、布尔值、嵌套对象),你可能需要使用Dictionary<string, object>或创建一个自定义类来匹配你的JSON结构。如果你有一个更复杂的JSON结构,请提供它,我可以帮助你解析成一个字典。

相关问题