访问名称中带有点的属性

Rah*_*Jha 6 c# json json.net

我试图反序列化JSON.我的根对象有一个属性"en.pickthall".我使用动态类型来读取我的JSON.我以为我可以放弃"." 在属性中,因为它是一个本地JSON文件,但是必须有一些方法来访问这样的属性

var result = App_Code.FileIOHelper.ReadFromDefaultFile("ms-appx:///Assets/en.pickthall.json");

dynamic stuff = JsonConvert.DeserializeObject(result);

foreach(var x in stuff.(en.pickthall)) //Tried this intellisense didn't like it
{

}
Run Code Online (Sandbox Code Playgroud)

Art*_*Rey 14

您可以创建一个根类来反序列化并使用JsonProperty:

public class Root
{
    [JsonProperty(PropertyName = "en.pickthall")]
    public object EnPickthall { get; set; }

    public Root() {}

    public Root(en_pickthall)
    {
        this.EnPickthall = en_pickthall;
    }
}
Run Code Online (Sandbox Code Playgroud)

然后你可以打电话

Root stuff = JsonConvert.DeserializeObject<Root>(result);

foreach(var x in stuff.EnPickthall)
{

}
Run Code Online (Sandbox Code Playgroud)


Lua*_*aan 7

C# 没有任何引用标识符的方法。如果它不是一个有效的标识符,你唯一的选择就是反射。

但是,您的 JSON 反序列化器返回的对象可能会更改标识符以使其在 C# 中可用 - 您可能想要枚举所有属性以检查是否是这种情况。带有索引器的动态对象也可能是一种解决方案(允许例如stuff["en.pickthall"])。

另一种选择是更改序列化程序映射属性的方式。例如,Newtonsoft.Jsoft 允许您使用IContractResolver. .以这种方式将 替换为更符合 C# 标准的东西是很容易的。


der*_*her 6

您可以不序列化为动态,而是序列化为JObject然后通过访问您的财产

JObject stuff = JsonConvert.DeserializeObject<JObject>(Jsonstring);
var x = stuff.Value<String>("my.property")
Run Code Online (Sandbox Code Playgroud)