首页 > 解决方案 > 解析 JSON 并应用过滤器

问题描述

ObservableCollection<dynamic>在 C# 中调用了 myJSON,有 4 项如下:

[
    {
      "name": "A",
      "location": "NY"
    },

    {
      "name": "B",
      "location": "NJ"
    },
    {
      "name": "A",
      "location": "NY"
    },

    {
      "name": "D",
      "location": "MA"
    }
]

我需要能够应用过滤查询,例如说 where name="A" 和 location="NY",然后从上面取回 2 条记录。

我尝试了如下代码,但我一次只能从上述集合中解析一条记录。而且第 2 行似乎出错了一条消息:

“无法访问 Newtonsoft.Json.Linq.JValue 上的子值。”

JObject json = JObject.Parse(myJSON[0].ToString()); 
var match = json.Values<JProperty>().Where(m => m.Value["name"].ToString() == "A" && m.Value["location"].ToString() == "NY").FirstOrDefault();

谢谢。

标签: c#jsonlinq

解决方案


这里:

using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.IO;
using System.Linq;
using Newtonsoft.Json;

namespace NameLoc
{
    class Program
    {

        class NameLoc 
        {
            public string Name;
            public string Location;
        }
        static void Main(string[] args)
        {
            var lst = JsonConvert.DeserializeObject<ObservableCollection<NameLoc>>(File.ReadAllText("NameLoc.json"));
            var selLst = from sel in lst where sel.Name == "A" && sel.Location == "NY" select sel;
            foreach (var it in selLst)
            {
                Console.WriteLine($"{it.Name}, {it.Location}");
            }

            Console.WriteLine("Hello World!");
        }
    }
}

然后一定要添加一个文件“NameLoc.Json”设置构建操作复制到输出我发现你的json中的错误在下面更正了。将 Newtonsoft.json 添加到 pkgs

[
  {
    "name": "A",
    "location": "NY"
  },
  {
    "name": "B",
    "location": "NJ"
  },

  {
    "name": "A",
    "location": "NY"
  },

  {
    "name": "D",
    "location": "MA"
  }
]

推荐阅读