1

JSON

{
  "count": 3,
  "value": [
    {
      "id": "AAAAAAAAAAAAA",
      "description": "test1",
      "name": "name1"
    },
    {
      "id": "BBBBBBBBBB",
      "description": "test2",
      "name": "name2"
    },
    {
      "id": "CCCCCCCCCCCC",
      "description": "test3",
      "name": "name3"
    }
  ]
}

我的解决方案中有一个从 LIST api 检索并提供上面 JSON 的代码。如何使用 LINQ 检索特定值?(例如)我需要选择name1,我会得到id, description,name值。

dynamic在我的代码中使用了一个变量:

dynamic json = JObject.Parse(client.GetString().Result);

在过去的几个小时里,我一直在修改其他在线指南。但是,无法得到正确的结果。

请帮忙。

4

4 回答 4

4

一种解决方案是将 JSON 字符串反序列化为 C# 对象,然后使用 Linq 获取特定对象。

C# 类定义:

public class Content
{
    [JsonProperty("count")]
    public int Count { get; set; }

    [JsonProperty("value")]
    public List<Value> Values { get; set; }

    public Content()
    {
        Values = new List<Value>();
    }
}

public class Value
{
    [JsonProperty("id")]
    public string Id { get; set; }

    [JsonProperty("description")]
    public string Description { get; set; }

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

反序列化并获取对象:

string json = @"{
""count"": 3,
""value"": [
  {
    ""id"": ""AAAAAAAAAAAAA"",
    ""description"": ""test1"",
    ""name"": ""name1""
  },
  {
    ""id"": ""BBBBBBBBBB"",
    ""description"": ""test2"",
    ""name"": ""name2""
  },
  {
    ""id"": ""CCCCCCCCCCCC"",
    ""description"": ""test3"",
    ""name"": ""name3""
  }
]
}";


Content content = JsonConvert.DeserializeObject<Content>(json);

Value value = content.Values.FirstOrDefault(x => x.Name.Equals("name1", StringComparison.InvariantCultureIgnoreCase));
于 2018-10-03T09:32:14.183 回答
2

首先,您可以创建一个类来代表客户:

public class Client
{
    public string Id { get; set; }
    public string Description { get; set; }
    public string Name { get; set; }
}

使用此类,您可以使用JObject.Parse(正如您已经在做的那样)将 JSON 解析为可以查询的内容,用于SelectToken提取value数组,然后将ToObject其转换为Clients 列表。看起来是这样的:

var jsonObject = JObject.Parse(json_source);
var jsonObjectValue = jsonObject.SelectToken("value");
var clients = jsonObjectValue.ToObject<List<Client>>();

一旦你得到你的clients变量,你可以使用一个简单的 LINQ 语句来找到一个name1

var clientWithName1 = clients.SingleOrDefault(x => x.Name == "name1");

在这种情况下,clientWithName如果null没有找到这样的客户端。

这是一个演示完整解决方案的dotnetfiddle

于 2018-10-03T09:47:47.107 回答
1

创建一个具有属性 id、description 和 name 的对象 Client。将 json 反序列化为这些对象的列表。

List<Client> clients = JsonConvert.Deserialize<List<Client>>(json_source);
string desc = clients[0].description;
于 2018-10-03T09:23:10.003 回答
-1

显然,在摆弄我的代码后,我为自己找到了答案。感谢那些试图帮助我给我想法的人。

var requestWorkProcess = await client.GetStringAsync("my url");
var workProcessId = JObject.Parse(requestWorkProcess)["value"].Children<JObject>().FirstOrDefault(o => o["name"].ToString() == workProcess).GetValue("id");
于 2018-10-03T10:42:28.583 回答