仅反序列化JSON文件的一个属性
问题描述:
我遇到问题。 我想反序列化来自服务器的复杂JSON响应,但我只需要它的一部分。仅反序列化JSON文件的一个属性
下面是一个例子:
{
"menu": {
"id": "file",
"value": "File",
"popup": {
"menuitem": [
{"value": "New", "onclick": "CreateNewDoc()"},
{"value": "Open", "onclick": "OpenDoc()"},
{"value": "Close", "onclick": "CloseDoc()"}
]
}
}
}
我也用Csharp2json得到我需要的类的对象,我只是根据我的需要修改菜单类:
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; }
}
现在,如何如果我只需要弹出窗口值和他的孩子,我是否反序列化?
答
如果你想以困难的方式尝试,你可以实际使用NewtonSoft.Json的Linq命名空间并修改你的代码以获得JSON中的“popup”元素。
您的班级结构保持不变。请确保您使用的命名空间(一个或多个)
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
然后在你的代码,一旦你有JSON字符串,你可以使用“JObject”静态方法“解析”解析JSON,像
var parsedObject = JObject.Parse(jsonString);
这会为您提供JObject,您可以像使用字典一样访问所有JSON密钥。
var popupJson = parsedObject["menu"]["popup"].ToString();
此popupJson现在只有弹出式键的JSON。 用这个你可以使用JsonConvert来反序列化JSON。
var popupObj = JsonConvert.DeserializeObject<Popup>(popupJson);
此popupObj只有菜单项列表。
希望这会有所帮助!
你为什么不把所有的回答都选出来并选择Popup?所有响应的解除效果只比您的需求稍贵一些 – Kirhgoph
您已经*应该*已经*执行您所描述的内容。当你通过解串器运行时会发生什么?即'var root = JsonConvert.DeserializeObject(json); var menuitems = root.menu.popup.menuitem;'? –
在这种情况下,我会反序列化所有的东西。但这只是我实际Json的简化。 对此URL进行获取请求以获得实际的json:http://transport.opendata.ch/v1/connections?from=lausanne&to=fribourg 这是极其复杂和漫长的。 @MarcGravell它说:“对象引用未设置为对象的实例。” –