我正在尝试反序列化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
{
}
答案 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,我也听说过这个问题可能解决了这个问题但是我无法解决这个问题。开始工作。