C# 使用JSON.NET和C从JSON获取子属性
我已经读了很多论坛,但似乎仍然无法将其拼凑起来。我正在使用Json.Net解析Json文件。它非常大,我只想要一块。我打电话并像这样解析它:C# 使用JSON.NET和C从JSON获取子属性,c#,.net,json,parsing,json.net,C#,.net,Json,Parsing,Json.net,我已经读了很多论坛,但似乎仍然无法将其拼凑起来。我正在使用Json.Net解析Json文件。它非常大,我只想要一块。我打电话并像这样解析它: string json = string.Empty; HttpWebResponse response; string url = @""; HttpWebRequest request = (HttpWebRequest)(WebRequest.Create(url)); using (response = (HttpWebResponse)r
string json = string.Empty;
HttpWebResponse response;
string url = @"";
HttpWebRequest request = (HttpWebRequest)(WebRequest.Create(url));
using (response = (HttpWebResponse)request.GetResponse())
using (Stream stream = response.GetResponseStream())
using (StreamReader reader = new StreamReader(stream))
{
json = reader.ReadToEnd();
}
JObject obj = JObject.Parse(json);
var myElement = o.Children<JProperty>().FirstOrDefault(x => x.Name == "properties");
var jobj = (JObject)myElement.Value;
Dictionary<string, string> myProperties = new Dictionary<string, string>();
foreach(var jprop in jobj) {
var key = jprop.Key;
var value = ((JObject)jprop.Value).Properties().First().Value.ToString();
myProperties[key] = value;
}
就像我说的,这个JSON非常庞大,但它只是一个很长的联系人列表。以下是单个联系人包含的内容:
{
"contacts": [
{
"addedAt": 1234,
"vid": 1234,
"canonical-vid": 1234,
"merged-vids": [
1234,
1234
],
"portal-id": 1234,
"is-contact": true,
"profile-token": "": "",
"properties": {
"country": {
"value": "united states"
},
"firstname": {
"value": "Example"
},
"jobtitle": {
"value": "Developer"
},
"primary_role": {
"value": "Developer"
},
"lastmodifieddate": {
"value": "1234"
},
"state": {
"value": "CO"
},
"email": {
"value": "example@notreal.com"
},
"lastname": {
"value": "Example"
}
},
"form-submissions": [
{
"conversion-id": "1234",
"timestamp": 1234,
"form-id": "",
"portal-id": 1234,
"page-url": "",
"page-title": "",
"title": "",
"form-type": "",
"meta-data": []
}
],
"identity-profiles": [
{
"vid": 1234,
"saved-at-timestamp": 1234,
"deleted-changed-timestamp": 234,
"identities": [
{
"type": "EMAIL",
"value": "example@notreal.com",
"timestamp": 1243,
"is-primary": true
},
{
"type": "TYPE",
"value": "",
"timestamp": 1234
},
{
"type": "EMAIL",
"value": "example@notreal.com",
"timestamp": 1234,
"is-secondary": true
}
]
},
{
"vid": 1234,
"saved-at-timestamp": 1324,
"deleted-changed-timestamp": 0,
"identities": [
{
"type": "TYPE",
"value": "",
"timestamp": 1234
}
]
}
],
"merge-audits": [
{
"canonical-vid": 1234,
"vid-to-merge": 1234,
"timestamp": 1324,
"entity-id": "",
"user-id": 1234,
"num-properties-moved": 234,
"merged_from_email": {
"value": "notreal@example.com",
"source-type": "CONTACTS",
"source-id": "SOURCE",
"source-label": null,
"source-vids": [
1234
],
"timestamp": 1234,
"selected": false
},
"merged_to_email": {
"value": "example@notreal.com",
"source-type": "TYPE",
"source-id": "",
"source-label": null,
"timestamp": 1234,
"selected": false
},
"first-name": "Example",
"last-name": "Example"
}
]
}
],
"has-more": true,
"vid-offset": 1234
}
我不关心这里的任何信息,除了属性下的信息。属性中的所有内容都需要存储在字典中,例如。下面的代码提供了chuck的全部属性:
foreach(var item in contacts.Children())
{
var itemProps = item.Children<JProperty>();
var myElement = itemProps.FirstOrDefault(x => x.Name == "properties");
var myElementValue = myElement.Value;
}
一,;我正在努力解决如何进一步缩小这个范围,并获得一个字典或一些填充了属性中的键值的东西?非常感谢您的帮助。根据您的描述,您的myElement是一个JProperty,包含嵌套的作业对象,每个作业对象都有一个JProperty子级,如下所示:
string json = string.Empty;
HttpWebResponse response;
string url = @"";
HttpWebRequest request = (HttpWebRequest)(WebRequest.Create(url));
using (response = (HttpWebResponse)request.GetResponse())
using (Stream stream = response.GetResponseStream())
using (StreamReader reader = new StreamReader(stream))
{
json = reader.ReadToEnd();
}
JObject obj = JObject.Parse(json);
var myElement = o.Children<JProperty>().FirstOrDefault(x => x.Name == "properties");
var jobj = (JObject)myElement.Value;
Dictionary<string, string> myProperties = new Dictionary<string, string>();
foreach(var jprop in jobj) {
var key = jprop.Key;
var value = ((JObject)jprop.Value).Properties().First().Value.ToString();
myProperties[key] = value;
}
这有点难看,您需要添加一些空检查等,但您可以遍历元素并填充一个属性字典,如下所示:
string json = string.Empty;
HttpWebResponse response;
string url = @"";
HttpWebRequest request = (HttpWebRequest)(WebRequest.Create(url));
using (response = (HttpWebResponse)request.GetResponse())
using (Stream stream = response.GetResponseStream())
using (StreamReader reader = new StreamReader(stream))
{
json = reader.ReadToEnd();
}
JObject obj = JObject.Parse(json);
var myElement = o.Children<JProperty>().FirstOrDefault(x => x.Name == "properties");
var jobj = (JObject)myElement.Value;
Dictionary<string, string> myProperties = new Dictionary<string, string>();
foreach(var jprop in jobj) {
var key = jprop.Key;
var value = ((JObject)jprop.Value).Properties().First().Value.ToString();
myProperties[key] = value;
}
属性是复数的,这意味着它由多个值组成-根据你的帖子是8-因此,如果你要解析它,你需要找出每个值。我们需要知道你的JSON文件的格式,以给出一个具体的答案,即a。但是在解析巨大的JSON文件而不将其完全加载到内存中时,已经存在一些问题,请参见和。但是用JObject.Parsejson加载它;将最大限度地利用内存,因为您将为JSON分配一个巨大的字符串,然后为所有属性分配JProperty字符串名称。非常有用!谢谢你对所发生的事情的想象,这真的帮助我理解了它。