Получить идентификатор из ответа Spotify JSON с помощью NewtonsoftJSON

avatar
Bobby ESP
1 июля 2021 в 15:42
67
2
0

мне нужно было получить данные "id" из этого ответа JSON с помощью NewtonsoftJSON в C#:

{
  "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
    }
  ]
}

Мне нужно всегда получать данные "id" из блока данных, который содержит имя "Fluent Spotify".

Площадка документации Spotify для этого: https://developer.spotify.com/console/get-users-available-devices/

Итак, кто-нибудь может сказать мне, как это разобрать? Я новичок в С#. Спасибо

Источник
Slugsie
1 июля 2021 в 15:47
2

Пожалуйста, возьмите тур. что ты уже испробовал? Пожалуйста, опубликуйте свой код и любые ошибки, которые вы получаете. Веб-сайт Newtonsoft дает хорошие примеры того, как десериализовать объекты JSON в C# link

Ответы (2)

avatar
Hadi Rajabi
1 июля 2021 в 16:20
0

Вы можете прочитать Запрос JSON с помощью LINQ и Выбрать токен в newtonsoft

попробуйте :

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");
avatar
Jamiec
1 июля 2021 в 16:26
1

Существуют сервисы, которые будут генерировать для вас классы C# из фрагмента json. Они неплохо справляются с вашим примером 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" - если нет, произойдет ошибка. Используйте FirstOrDefault или <31882903333381>, если вам нужно справиться с этой ситуацией.