Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/13.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文件的一个属性_C#_Json_Visual Studio_Json.net - Fatal编程技术网

C# 仅反序列化JSON文件的一个属性

C# 仅反序列化JSON文件的一个属性,c#,json,visual-studio,json.net,C#,Json,Visual Studio,Json.net,我面临一个问题。 我想从服务器反序列化一个复杂的JSON响应,但我只需要其中的一部分 以下是一个例子: { "menu": { "id": "file", "value": "File", "popup": { "menuitem": [ {"value": "New", "onclick": "CreateNewDoc()"}, {"value": "Open", "onclick": "OpenDoc()"}, {"value": "

我面临一个问题。 我想从服务器反序列化一个复杂的JSON响应,但我只需要其中的一部分

以下是一个例子:

{
 "menu": {
  "id": "file",
  "value": "File",
  "popup": {
    "menuitem": [
      {"value": "New", "onclick": "CreateNewDoc()"},
      {"value": "Open", "onclick": "OpenDoc()"},
      {"value": "Close", "onclick": "CloseDoc()"}
    ]
  }
 }
}
我还使用Csharp2json来获取我需要的类对象,我只是根据我的需要修改了menu类:

    public class Menuitem
{
    public string value { get; set; }
    public string onclick { get; set; }
}

public class Popup
{
    public IList<Menuitem> menuitem { get; set; }
}

public class Menu
{
    public Popup popup { get; set; }
}

public class RootObjectJourney
{
    public Menu menu { get; set; }
}
公共类菜单项
{
公共字符串值{get;set;}
公共字符串onclick{get;set;}
}
公共类弹出窗口
{
公共IList菜单项{get;set;}
}
公共类菜单
{
公共弹出窗口{get;set;}
}
公共课之旅
{
公共菜单{get;set;}
}

现在,如果我只需要popup值和它的子元素,我该如何反序列化?

您实际上可以利用NewtonSoft.Json的Linq名称空间,并稍微修改代码,从Json中只获取“popup”元素

var popupObj = JsonConvert.DeserializeObject<Popup>(popupJson);
你的班级结构保持不变。确保使用命名空间

然后在代码中,一旦有了JSON字符串,就可以使用“JObject”静态方法“Parse”来解析JSON,如

   var parsedObject = JObject.Parse(jsonString);
这将为您提供一个JObject,您可以使用它访问所有JSON键,就像访问字典一样

var popupJson = parsedObject["menu"]["popup"].ToString();
这个popupJson现在只有用于弹出键的JSON。 有了它,您可以使用JsonConvert对JSON进行反序列化

var popupObj = JsonConvert.DeserializeObject<Popup>(popupJson);
var popupObj=JsonConvert.DeserializeObject(popupJson);

这个popupObj只有一个菜单项列表。

如果要反序列化一个属性,由于它的灵活性,我通常建议使用JsonPath。请检查下面的代码

var jsonQueryString = "{ 'firstName': 'John',
 'lastName' : 'doe',
 'age'      : 26,}";
JObject o = JObject.Parse(jsonQueryString);
JToken token= o.SelectToken("$.age");   
Console.WriteLine(token);
如果Json很复杂,那么可以使用JsonPath的强大功能。 您可以查看JsonPath的详细文档和示例

我还提供了下面的示例以获取更多使用信息:

JObject o = JObject.Parse(@"{
        'store': {
            'book': [
            {
                'category': 'history',
                'author': 'Arnold Joseph Toynbee',
                'title': 'A Study of History',
                'price': 5.50
            },
            ...
            ]
        },
        'expensive': 10
        }");
        //gets first book object
        Console.WriteLine(o.SelectToken("$..book[0]"));
        //get first book's title
        Console.WriteLine(o.SelectToken("$..book[0].title"));

        // get authors of the books where the books are cheaper then 10 $
        foreach (var token in o.SelectTokens("$..[?(@.price < 10)].author"))
            Console.WriteLine(token);
JObject o=JObject.Parse(@){
“商店”:{
“书”:[
{
“类别”:“历史”,
“作者”:“阿诺德·约瑟夫·汤因比”,
‘标题’:‘历史研究’,
“价格”:5.50
},
...
]
},
‘昂贵’:10
}");
//获取第一个图书对象
Console.WriteLine(o.SelectToken($…book[0]);
//获得第一本书的书名
Console.WriteLine(o.SelectToken($…book[0].title”);
//找那些比10本书便宜的书的作者$
foreach(o.SelectTokens($..[?(@.price<10)].author)中的var标记)
控制台写入线(令牌);

如果您不使用
Newtonsoft
并且正在
.NET Core
中使用
System.Text.Json
,您可以使用以下方法:

var post = JsonDocument.Parse(stringifiedJson);
var cat = post.RootElement.GetProperty("category").GetString();
您可以在这里看到
GetString
将值强制转换为字符串,还有其他重载可用于将json值强制转换为
Int32
等。

.NET 5+

解决方案非常简单:

using System.Text.Json;

var doc = JsonDocument.Parse(response.Content);
var popupJson= doc.RootElement.GetProperty("menu").GetProperty("popup");

您为什么不重新设置所有响应并只选择弹出窗口?所有回应的反价值只是比你的案例中所需要的稍微贵一点,你应该已经做了你所描述的。当您通过反序列化程序运行它时会发生什么?i、 e.
var root=JsonConvert.DeserializeObject(json);var menuitems=root.menu.popup.menuitem?在这种情况下,我将反序列化所有内容。但这只是我实际Json的简化。在此url上执行Get请求以获取实际的json:它非常复杂和长@MarcGravel它说“对象引用未设置为对象的实例”。@A.Silva那么您的简化模型与实际数据不匹配;我无法告诉您链接到哪里,因为您链接到的JSON与您创建的模型无关provided@MarcGravell,可能我不理解100%的错误。呃,从字符串到json对象再到字符串到弹出对象的往返。这可能比只取一整堆要贵。要将JObject转换为自定义类,您需要做的是:。