首页 > 解决方案 > 如何从.net动态数组对象中获取属性值

问题描述

我有一个 json 文件包含

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

现在我想从 Photo 对象中获取所有 Instance 属性。我有以下代码:

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 的方式解决这个问题吗?

标签: c#.netjsonlinq

解决方案


为什么不使用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();

推荐阅读