我遇到了一个问题。 我想从服务器反序列化一个复杂的JSON响应,但我只需要它的一部分。
以下是一个例子:
sum(1)
我还使用Csharp2json来获取我需要的类对象,我只是根据我的需要修改了菜单类:
ctx.Foos.WhereVersionGreaterThan(r => r.RowVersion, myVersion);
现在,如果我只需要弹出值和他的孩子,我该如何反序列化?
答案 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");