.NET中反序列化含点(.)键名的JSON字符串方法咨询
在.NET中反序列化带点号键名的JSON字符串
碰到这种带点号的JSON键(比如odata.metadata)其实很常见,尤其是像OData这类返回格式,下面给你两种主流序列化库的解决方案,还有临时处理的小技巧:
1. 使用Newtonsoft.Json(Json.NET)
这是很多.NET项目里常用的第三方序列化库,处理这种场景很直接:
步骤1:定义实体类,通过特性指定映射
创建对应JSON结构的实体类,给每个和带点键对应的属性加上[JsonProperty]特性,指定JSON里的原始键名:
public class ODataResponse { [JsonProperty("odata.metadata")] public string OdataMetadata { get; set; } [JsonProperty("odata.nextLink")] public string OdataNextLink { get; set; } public List<RegionItem> Value { get; set; } } public class RegionItem { [JsonProperty("odata.type")] public string OdataType { get; set; } [JsonProperty("odata.id")] public string OdataId { get; set; } [JsonProperty("odata.etag")] public string OdataEtag { get; set; } [JsonProperty("odata.editLink")] public string OdataEditLink { get; set; } public int FileSystemObjectType { get; set; } public int Id { get; set; } public Uri ServerRedirectedEmbedUri { get; set; } }
步骤2:执行反序列化
用JsonConvert.DeserializeObject方法来解析JSON字符串:
string json = @"{""odata.metadata"": ""sometext"", ""odata.nextLink"": ""sometext"", ""value"": [{""odata.type"": ""SP.Data.RegionsListItem"", ""odata.id"": ""07404daa-61b5-4947-af9f-38f29822f775"", ""odata.etag"": ""\""3\"""", ""odata.editLink"": ""Web/Lists(guid'65dc896b-df87-4145-98d9-57c7ea619e66')/Items(3)"", ""FileSystemObjectType"": 0, ""Id"": 3, ""ServerRedirectedEmbedUri"": null}]}"; var response = JsonConvert.DeserializeObject<ODataResponse>(json);
2. 使用.NET内置的System.Text.Json
如果你用的是.NET Core 3.0+或者.NET 5+,可以直接用官方内置的System.Text.Json,思路类似,只是特性不一样:
步骤1:定义实体类,用[JsonPropertyName]指定映射
using System.Text.Json.Serialization; public class ODataResponse { [JsonPropertyName("odata.metadata")] public string OdataMetadata { get; set; } [JsonPropertyName("odata.nextLink")] public string OdataNextLink { get; set; } public List<RegionItem> Value { get; set; } } public class RegionItem { [JsonPropertyName("odata.type")] public string OdataType { get; set; } [JsonPropertyName("odata.id")] public string OdataId { get; set; } [JsonPropertyName("odata.etag")] public string OdataEtag { get; set; } [JsonPropertyName("odata.editLink")] public string OdataEditLink { get; set; } public int FileSystemObjectType { get; set; } public int Id { get; set; } public Uri ServerRedirectedEmbedUri { get; set; } }
步骤2:执行反序列化
用JsonSerializer.Deserialize方法:
using System.Text.Json; string json = @"{""odata.metadata"": ""sometext"", ""odata.nextLink"": ""sometext"", ""value"": [{""odata.type"": ""SP.Data.RegionsListItem"", ""odata.id"": ""07404daa-61b5-4947-af9f-38f29822f775"", ""odata.etag"": ""\""3\"""", ""odata.editLink"": ""Web/Lists(guid'65dc896b-df87-4145-98d9-57c7ea619e66')/Items(3)"", ""FileSystemObjectType"": 0, ""Id"": 3, ""ServerRedirectedEmbedUri"": null}]}"; var response = JsonSerializer.Deserialize<ODataResponse>(json);
3. 临时处理:动态访问(不需要实体类)
如果只是临时读取某个字段,不想定义实体类,可以用动态对象的方式:
- 对于Newtonsoft.Json,用
JObject:
var jObject = JObject.Parse(json); string metadata = (string)jObject["odata.metadata"]; string firstItemId = (string)jObject["value"][0]["odata.id"];
- 对于System.Text.Json,用
JsonDocument:
using (JsonDocument doc = JsonDocument.Parse(json)) { JsonElement root = doc.RootElement; string metadata = root.GetProperty("odata.metadata").GetString(); JsonElement firstItem = root.GetProperty("value")[0]; string itemId = firstItem.GetProperty("odata.id").GetString(); }
内容的提问来源于stack exchange,提问作者someone
相关产品推荐
相关产品推荐

