C# 仅反序列化JSON文件的一个属性
我面临一个问题。 我想从服务器反序列化一个复杂的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": "
{
"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转换为自定义类,您需要做的是:。