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

时间:2017-06-22 14:00:21

标签: c# json visual-studio json.net

我遇到了一个问题。 我想从服务器反序列化一个复杂的JSON响应,但我只需要它的一部分。

以下是一个例子:

sum(1)

我还使用Csharp2json来获取我需要的类对象,我只是根据我的需要修改了菜单类:

ctx.Foos.WhereVersionGreaterThan(r => r.RowVersion, myVersion);

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

4 个答案:

答案 0 :(得分:7)

如果你想以艰难的方式尝试,你可以实际使用NewtonSoft.Json的Linq命名空间并稍微修改你的代码以仅获得" popup"来自JSON的元素。

你的班级结构保持不变。确保使用命名空间

using Newtonsoft.Json;
using Newtonsoft.Json.Linq;

然后在你的代码中,一旦你有了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);

这个popupObj只有menuitems列表。

希望这有帮助!

答案 1 :(得分:1)

如果您不使用 Newtonsoft 而在 System.Text.Json 中使用 .NET Core,您可以使用这个:

var post = JsonDocument.Parse(stringifiedJson);
var cat = post.RootElement.GetProperty("category").GetString();

您在此处看到 GetString 将值转换为字符串,还有其他重载可用于将 json 值转换为 Int32 等。

答案 2 :(得分:0)

如果打算仅反序列化一个属性,则由于其灵活性,我通常首选使用JsonPath。请检查下面的代码

var jsonQueryString = "{ 'firstName': 'John',
 'lastName' : 'doe',
 'age'      : 26,}";
JObject o = JObject.Parse(jsonQueryString);
JToken token= o.SelectToken("$.age");   
Console.WriteLine(token);

如果您的Json很复杂,则可以使用JsonPath的强大功能。 您可以查看https://support.smartbear.com/readyapi/docs/testing/jsonpath-reference.html#examples以获取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);

答案 3 :(得分:0)

.NET 5+

解决方法很简单:

using System.Text.Json;

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