C# 在属性名称中使用$in反序列化JSON
我有以下JSON对象(对象的形状会有所不同,因此使用dynamic): 我使用Newtonsoft.Json解析如下:C# 在属性名称中使用$in反序列化JSON,c#,json,json.net,C#,Json,Json.net,我有以下JSON对象(对象的形状会有所不同,因此使用dynamic): 我使用Newtonsoft.Json解析如下: dynamic dyn = JObject.Parse(json); 我的问题是,我无法引用任何动态属性,因为包含$的父属性出现语法错误: Console.WriteLine(dyn.mba$maccType); 如何获取“class.intlId”(即“cacc”)的值?您可以将JSON解析为,而不是动态类型,并通过键访问其项。就像从mba$maccType中获取第一项一
dynamic dyn = JObject.Parse(json);
我的问题是,我无法引用任何动态属性,因为包含$的父属性出现语法错误:
Console.WriteLine(dyn.mba$maccType);
如何获取“class.intlId”(即“cacc”)的值?您可以将JSON解析为,而不是
动态
类型,并通过键访问其项。就像从mba$maccType
中获取第一项一样(因为它是一个数组),然后从中访问class
令牌和intlId
值
var jObject=jObject.Parse(json);
var firstItem=jObject[“mba$maccType”]?.FirstOrDefault();
var result=firstItem?[“class”]?[“intlId”]?.ToString();//返回“cacc”
假设JSON结构的唯一动态部分是外部对象上的属性名,您可以将此JSON反序列化到
字典
。这样做的好处是,对于反序列化的几乎所有内容,您都可以清楚地定义类型
// type definitions
class ClassRecord
{
public int id { get; set; }
public string intlId { get; set; }
}
class Item
{
public ClassRecord @class { get; set; }
public bool classA { get; set; }
// etc.
}
// deserialize
var obj = JsonConvert.DeserializeObject<Dictionary<string, List<Item>>>(json);
Console.WriteLine(obj["mba$maccType"][0].@class.id); // 1057
//类型定义
班级记录
{
公共int id{get;set;}
公共字符串intlId{get;set;}
}
类项目
{
public ClassRecord@class{get;set;}
公共布尔类a{get;set;}
//等等。
}
//反序列化
var obj=JsonConvert.DeserializeObject(json);
Console.WriteLine(obj[“mba$maccType”][0].@class.id);//1057
这是否回答了您的问题?链接的问题使用了JsonConvert.DeserializeObject
,但它会导致相同的JObject
,属性名称中包含非法字符,因此答案也应适用于您的情况。
// type definitions
class ClassRecord
{
public int id { get; set; }
public string intlId { get; set; }
}
class Item
{
public ClassRecord @class { get; set; }
public bool classA { get; set; }
// etc.
}
// deserialize
var obj = JsonConvert.DeserializeObject<Dictionary<string, List<Item>>>(json);
Console.WriteLine(obj["mba$maccType"][0].@class.id); // 1057