Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/304.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# Newtonsoft.Json.Linq.JProperty不包含名称的定义_C#_Json_Oop_Json.net - Fatal编程技术网

C# Newtonsoft.Json.Linq.JProperty不包含名称的定义

C# Newtonsoft.Json.Linq.JProperty不包含名称的定义,c#,json,oop,json.net,C#,Json,Oop,Json.net,我正在从以下JSON中提取数据 string strResponse = @"[ { 'forename': 'Harry', 'surname': 'Potter', 'house': 'Gryffindor' }, { 'forename': 'Draco', 'surname': 'Malfoy', 'house': 'Slytherin' }, {

我正在从以下JSON中提取数据

string strResponse =
@"[
    {
        'forename': 'Harry',
        'surname': 'Potter',
        'house': 'Gryffindor'
    },
    {
        'forename': 'Draco',
        'surname': 'Malfoy',
        'house': 'Slytherin'
    },
    {
        'forename': 'Luna',
        'surname': 'Lovegood',
        'house': 'Ravenclaw'
    }
]";
我使用的C#如下所示:

dynamic dynJson = JsonConvert.DeserializeObject(strResponse);
foreach (var item in dynJson)
{
    string output = string.Format("{0} {1} {2}", item.forename, item.surname, item.house);
    Console.WriteLine(output);
}
这工作正常,输出如预期

但是,当JSON的格式稍有不同时,例如:

string strResponse =
@"{
    'People': [
    {
        'forename': 'Harry',
        'surname': 'Potter',
        'house': 'Gryffindor'
    },
    {
        'forename': 'Draco',
        'surname': 'Malfoy',
        'house': 'Slytherin'
    },
    {
        'forename': 'Luna',
        'surname': 'Lovegood',
        'house': 'Ravenclaw'
    }
    ]
}";
我收到以下错误消息:

类型的未处理异常 中出现“Microsoft.CSharp.RuntimeBinder.RuntimeBinderException” System.Core.dll

其他信息:“Newtonsoft.Json.Linq.JProperty”没有 包含“名字”的定义


我知道这与新JSON字符串的结构有关,尤其是
部分。但是我不知道如何调整我的代码来处理这个问题,请帮助。

这里有一个工作示例。下次请阅读文档

JObject dynJson = JsonConvert.DeserializeObject(strResponse) as JObject;
dynJson.Dump();
foreach (var item in dynJson["People"])
{
    string output = string.Format("{0} {1} {2}", item["forename"], item["surname"], item["house"]);
    Console.WriteLine(output);
}

为什么您希望不同的JSON以相同的方式运行?第一个是一个具有您期望的属性的对象数组,第二个是一个具有
People
属性的对象,它像以前一样包含一个对象数组。@DavidG抱歉,我试图通过一个简单的示例(第一个JSON)来学习这一点,并重构我的代码,看看我需要为其他JSON字符串更改什么。我看到JSON以第二个JSON字符串的格式显示,我想知道我需要如何更改代码。最好的方法是避免完全使用dynamic,每次使用
dynamic
,一只小猫就会死。。。而是创建一组与您的结构相匹配的具体C#类。这样,就可以进行强大的编译时类型检查。在VisualStudio中,复制JSON,然后进入编辑/粘贴特殊菜单并将JSON粘贴为类。