使用 NewtonsoftJSON 从 Spotify JSON 响应中获取 id

Posted

技术标签:

【中文标题】使用 NewtonsoftJSON 从 Spotify JSON 响应中获取 id【英文标题】:Get id from a Spotify JSON response with NewtonsoftJSON 【发布时间】:2021-09-13 16:48:22 【问题描述】:

我需要使用 C# 中的 NewtonsoftJSON 从这个 JSON 响应中获取“id”数据:


  "devices": [
    
      "id": "0fa1a5aa7fdf4438a8082c993be1d9cd9bf0d32b",
      "is_active": false,
      "is_private_session": false,
      "is_restricted": false,
      "name": "DESKTOP-89E1DLU",
      "type": "Computer",
      "volume_percent": 26
    ,
    
      "id": "404bdc9492d312f104359d72c3ee55dd7f624120",
      "is_active": false,
      "is_private_session": false,
      "is_restricted": false,
      "name": "Fluent Spotify",
      "type": "Computer",
      "volume_percent": 100
    
  ]

我需要始终从包含 “Fluent Spotify” 名称的数据块中获取 “id” 数据。

为此的 Spotify 文档游乐场是:https://developer.spotify.com/console/get-users-available-devices/

那么有人可以告诉我如何解析这个吗?我是 C# 新手。谢谢

【问题讨论】:

请拨打tour。你都尝试了些什么?请发布您的代码和您遇到的任何错误。 Newtonsoft 网站提供了关于如何在 C# 中反序列化 JSON 对象的很好的示例link 如果答案已经解决了您的问题,请mark 它被稍后访问此主题的方便人士所接受 【参考方案1】:

有services 可以从 json sn-p 为您生成 c# 类。这些在您的 JSON 示例中做得很好:

public class Device

    [JsonProperty("id")]
    public string Id  get; set; 

    [JsonProperty("is_active")]
    public bool IsActive  get; set; 

    [JsonProperty("is_private_session")]
    public bool IsPrivateSession  get; set; 

    [JsonProperty("is_restricted")]
    public bool IsRestricted  get; set; 

    [JsonProperty("name")]
    public string Name  get; set; 

    [JsonProperty("type")]
    public string Type  get; set; 

    [JsonProperty("volume_percent")]
    public int VolumePercent  get; set; 


public class Root

    [JsonProperty("devices")]
    public List<Device> Devices  get; set; 

一个你有那些你将json解析为Root对象的类

Root myDeserializedClass = JsonConvert.DeserializeObject<Root>(myJsonResponse); 

然后你就可以使用 LINQ

var id = myDeserializedClass.Devices.First(x => x.Name == "Fluent Spotify").Id;

注意:以上假设总是有一个名称为“Fluent Spotify”的项目 - 如果没有,则会发生错误。如果您需要处理这种情况,请酌情使用FirstOrDefaultSingleOrDefault

【讨论】:

【参考方案2】:

您可以在 newtonsoft 中阅读 Querying JSON with LINQ 和 Select Token

试试这个:

string json = @"
  "devices": [
    
      "id": "0fa1a5aa7fdf4438a8082c993be1d9cd9bf0d32b",
      "is_active": false,
      "is_private_session": false,
      "is_restricted": false,
      "name": "DESKTOP-89E1DLU",
      "type": "Computer",
      "volume_percent": 26
    ,
    
      "id": "404bdc9492d312f104359d72c3ee55dd7f624120",
      "is_active": false,
      "is_private_session": false,
      "is_restricted": false,
      "name": "Fluent Spotify",
      "type": "Computer",
      "volume_percent": 100
    
  ]
";

JObject spotify = JObject.Parse(json);
string id = (string)spotify["devices"][1]["id"];
// id = 404bdc9492d312f104359d72c3ee55dd7f624120

或尝试条件:

JObject o = JObject.Parse(@"
  "devices": [
    
      "id": "0fa1a5aa7fdf4438a8082c993be1d9cd9bf0d32b",
      "is_active": false,
      "is_private_session": false,
      "is_restricted": false,
      "name": "DESKTOP-89E1DLU",
      "type": "Computer",
      "volume_percent": 26
    ,
    
      "id": "404bdc9492d312f104359d72c3ee55dd7f624120",
      "is_active": false,
      "is_private_session": false,
      "is_restricted": false,
      "name": "Fluent Spotify",
      "type": "Computer",
      "volume_percent": 100
    
  ]
");

JToken spotify = o.SelectToken("$.devices[?(@.name == 'Fluent Spotify')]");
var id = spotify.Value<string>("id");

【讨论】:

以上是关于使用 NewtonsoftJSON 从 Spotify JSON 响应中获取 id的主要内容,如果未能解决你的问题,请参考以下文章

Newtonsoft JSON- 与 DataSet 的转换导致 Decimal 变为 Double?

NewtonsoftJson 中的自定义 JSONConverter 用于序列化

从响应 url 中提取令牌 - Spotify API

ASP.NET Core MVC返回数据配置为json格式化组件为NewtonsoftJson

Newtonsoft JSON - 动态对象

Newtonsoft Json - 根据给定的选定属性序列化深度嵌套对象