You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.29 14:29:04