访问名称中带有点的属性

时间:2016-04-02 17:26:46

标签: 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
{

}

5 个答案:

答案 0 :(得分:12)

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

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

    public Root() {}

    public Root(en_pickthall)
    {
        this.EnPickthall = en_pickthall;
    }
}

然后你可以打电话

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

foreach(var x in stuff.EnPickthall)
{

}

答案 1 :(得分:4)

您可以序列化为动态,但序列化为JObject,然后通过

访问您的媒体资源
JObject stuff = JsonConvert.DeserializeObject<JObject>(Jsonstring);
var x = stuff.Value<String>("my.property")

答案 2 :(得分:2)

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

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

另一种方法是更改​​序列化程序映射属性的方式。例如,Newtonsoft.Jsoft允许您使用IContractResolver自定义此项。以这种方式替换.更多C#-sane很容易。

答案 3 :(得分:0)

使用动态对象和NewtonSoft.Json:

dynamic json = JValue.Parse(result);

   int Opens = Convert.ToInt32(json.opens);

   int Clicks = Convert.ToInt32(json.clicks);

   string State = json.state;

答案 4 :(得分:0)

我知道你说你正在使用动态类型进行JSON反序列化,但我只想指出那里有一个.NET RESTful客户端,它也支持静态模型定义。对于您或其他任何在C#REST调用中搜索属性名称中的点问题答案时遇到此响应的人。

截至新发布的RestSharp 106.1.0 (我的意思是这个版本,因为刚刚添加了此支持),它可以通过DeserializeAs属性处理名称中带点的重命名属性。例如,当我使用以下模型调用ElasticSearch API进行_cat调用时:

public class CatResponse
{
    public string index { get; set; }
    ...
    [DeserializeAs(Name = "docs.count")]
    public string docscount { get; set; }
}

实际上现在将docs.count属性反序列化为docscount:

 var resource = $"_cat/indices/{indexPattern}?format=json&pretty=true";

 var request = new RestRequest(resource, Method.GET);
 var response = client.Execute<List<CatResponse>>(request);

这个支持开箱即用并且不需要使用Newtonsoft.Json.JsonSerializer,我也听说过这个问题可能解决了这个问题但是我无法解决这个问题。开始工作。