我正在处理一个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());
}
}
2条答案
按热度按时间7ajki6be1#
我假设json根目录总是包含
meta
和target
属性。如果是这样,你可以这样做:然后你就这么做
现在你可以访问
Data
属性,并覆盖它的所有元素(对象)。如果你使用的是
System.Text.Json
,那么你只需要修改以下内容:如果你的json root有比上面例子更多的键,并且你只需要
target
,那么你可以省略Meta
属性,然后使用JsonSerializerSettings
并将MissingMemberHandling
设置为MissingMemberHandling.Ignore
,这将确保你只对DataContainer
类中提供的任何东西进行格式化。hec6srdp2#
在C#中,可以使用Newtonsoft.JSON库解析JSON,并将元素名称和值推送到字典中。下面是一个示例:
C#语言
这段代码是AI生成的。仔细阅读和使用。请访问我们的常见问题解答了解更多信息。
在这段代码中:
首先定义一个JSON字符串json。然后我们使用
JsonConvert.DeserializeObject<Dictionary<string, string>>(json)
将JSON字符串转换为字典。最后,我们打印出字典的键和值。请注意,您需要安装Newtonsoft.json包。您可以通过在Visual Studio中使用NuGet包管理器或在包管理器控制台中运行以下命令来执行此操作:这段代码假设JSON中的所有值都是字符串。如果你的JSON包含不同的类型(例如,数字、布尔值、嵌套对象),你可能需要使用
Dictionary<string, object>
或创建一个自定义类来匹配你的JSON结构。如果你有一个更复杂的JSON结构,请提供它,我可以帮助你解析成一个字典。