C# 在属性名称中使用$in反序列化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中获取第一项一

我有以下JSON对象(对象的形状会有所不同,因此使用dynamic):

我使用Newtonsoft.Json解析如下:

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