2017-06-22 88 views
0

我遇到问题。 我想反序列化来自服务器的复杂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; } 
} 

现在,如何如果我只需要弹出窗口值和他的孩子,我是否反序列化?

+0

你为什么不把所有的回答都选出来并选择Popup?所有响应的解除效果只比您的需求稍贵一些 – Kirhgoph

+3

您已经*应该*已经*执行您所描述的内容。当你通过解串器运行时会发生什么?即'var root = JsonConvert.DeserializeObject (json); var menuitems = root.menu.popup.menuitem;'? –

+0

在这种情况下,我会反序列化所有的东西。但这只是我实际Json的简化。 对此URL进行获取请求以获得实际的json:http://transport.opendata.ch/v1/connections?from=lausanne&to=fribourg 这是极其复杂和漫长的。 @MarcGravell它说:“对象引用未设置为对象的实例。” –

回答

2

如果你想以困难的方式尝试,你可以实际使用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只有菜单项列表。

希望这会有所帮助!