Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/296.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用JSON.NET和C从JSON获取子属性_C#_.net_Json_Parsing_Json.net - Fatal编程技术网

C# 使用JSON.NET和C从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

我已经读了很多论坛,但似乎仍然无法将其拼凑起来。我正在使用Json.Net解析Json文件。它非常大,我只想要一块。我打电话并像这样解析它:

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字符串名称。非常有用!谢谢你对所发生的事情的想象,这真的帮助我理解了它。