Как получить значение свойства из объекта массива. net Dynami c - PullRequest
0 голосов
/ 10 июля 2020

У меня есть файл json, содержащий

{
  "Accounts": null,
  "AccountTypes": null,
  "Actions": null,
  "Photos": [
    {
      "Instance": "...",
      "Key": "..."
    },
    ....
  ]
}

Теперь я хочу получить все свойства экземпляра из объектов Photo. У меня есть следующий код:

var photos = new List<Photo>();

string json = File.ReadAllText(file);
dynamic jsonObj = Newtonsoft.Json.JsonConvert.DeserializeObject(json, typeof(object));
var jsonPhotos = jsonObj.Photos as IEnumerable<dynamic>;
var instances = jsonPhotos.Select(x => x.Instance);

foreach (var instance in instances)
    photos.Add(new Photo
    {
        Document = Convert.FromBase64String(instance)
    });

Однако jsonPhotos.Select (x => x.Instance); ничего не возвращает ...

Я могу заставить все работать, используя

var instances = new List<string>();

foreach (var photo in jsonPhotos)
    instances.Add(photo.Instance.Value);

Но могу ли я решить эту проблему с помощью LINQ?

Ответы [ 2 ]

2 голосов
/ 10 июля 2020

Почему бы просто не использовать для этого Json.Linq? Разберите JSON в JObject экземпляр, затем сопоставьте каждый токен из массива Photos с экземпляром Photo (я пропустил Convert.FromBase64String, потому что образец OP не имеет действительных данных base64, но преобразовав Instance значение можно легко добавить)

var json = JObject.Parse(jsonString);

var photos = json["Photos"]
    .Select(token => new Photo
    {
        Document = token["Instance"]?.Value<string>()
    })
    .ToList();
0 голосов
/ 10 июля 2020

.Select(x => x.Instance) действительно возвращает ... на. NET Core 3.1. Можете ли вы убедиться, что содержимое переменной json действительно соответствует вашим ожиданиям?

В частности,

jsonPhotos.Select(x => x.Instance);

работает должным образом, а

jsonPhotos.Select(x => x.SomeNonExistingProperty);

ничего не перечисляет / пустые значения.

Например, этот код печатает Instance A, затем Instance B, а затем ничего дважды:

var json = @"
{
    ""Photos"": [
    {
        ""Instance"": ""Instance A"",
        ""Key"": ""...""
    },
    {
        ""Instance"": ""Instance B"",
        ""Key"": ""...""
    }]
}";

var jsonObj = JsonConvert.DeserializeObject<dynamic>(json);
var jsonPhotos = jsonObj.Photos as IEnumerable<dynamic>;

var instances = jsonPhotos.Select(x => x.Instance);
foreach (var instance in instances)
{
    Console.WriteLine(instance);
}

// In contrast, this one will print empty lines.
instances = jsonPhotos.Select(x => x.SomeNonExistingProperty);
foreach (string instance in instances)
{
    Console.WriteLine(instance);
}

Я взял на себя смелость изменить десериализацию на dynamic напрямую, но он также работает с исходный код из вопроса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...