首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >system.text.json搜索动态json

system.text.json搜索动态json
EN

Stack Overflow用户
提问于 2021-07-23 12:08:21
回答 1查看 955关注 0票数 1

我有一个JSON字符串:

代码语言:javascript
复制
string jsonString =
  "{
    "users":[
      {"name":"John", "code":"white", "job":"actor"},
      {"name":"Oliver", "code":"black", "job": "seller"}
     ]
  }"

然后使用以下方法反序列化它:

代码语言:javascript
复制
JsonElement je = JsonDocument.Parse(jsonString).RootElement;
JsonElement.ArrayEnumerator users = je.GetProperty("users").EnumerateArray();

使用system.text.json,如何获得代码为“黑色”的第一个JsonElement?我的意思是没有循环(foreach,.)。

使用newtonsoft.json,我可以简单地这样做:

代码语言:javascript
复制
dynamic json = JsonConvert.DeserializeObject(jsonString);
dynamic user = json.SelectToken("[?(@.code == 'black')]");
string name = user["name"], job = user["job"];
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-07-23 12:31:52

如何获得代码为“黑色”的第一个JsonElement

我将创建表示json结构的类,然后反序列化到这些类。

您可以这样创建您的类:

代码语言:javascript
复制
using System;
using System.Linq;
using System.Collections.Generic;    
using System.Text.Json;
using System.Text.Json.Serialization;

public class People
{   
    [JsonPropertyName("users")]
    public List<User> Users { get; set; }
}

public class User
{   
    [JsonPropertyName("name")]
    public string Name { get; set; }

    [JsonPropertyName("code")]
    public string Code { get; set; }

    [JsonPropertyName("job")]
    public string Job { get; set; }
}

然后反序列化:

代码语言:javascript
复制
string jsonString = "{\"users\":[{\"name\":\"John\",\"code\":\"white\",\"job\":\"actor\"},{\"name\":\"Oliver\",\"code\":\"black\",\"job\":\"seller\"}]}";
People people = JsonSerializer.Deserialize<People>(jsonString);

现在您可以获得第一个User对象,其中code是黑色的:

代码语言:javascript
复制
 var usr = people.Users.Where(u => u.Code == "black").FirstOrDefault();

下面是示例可以运行。

每个评论的更新

它是动态的JSON

您可以将json反序列化为JsonElement,然后尝试获取所需的属性。

代码语言:javascript
复制
var people = JsonSerializer.Deserialize<JsonElement>(jsonString);
if(people is JsonElement je && je.TryGetProperty("users", out je)){ 
   // obj will be JsonElement if match is found
   var obj = je.EnumerateArray().Where(je => je.TryGetProperty("code", out je) && je.GetString() == "black").FirstOrDefault();  
   // Get what you need
   var name = obj.TryGetProperty("name", out JsonElement eleName) ? eleName.GetString() : "No name";
   var job = obj.TryGetProperty("job", out JsonElement eleJob) ? eleJob.GetString() : "No job";
   Console.WriteLine(string.Format("{0}\n{1}", name, job));
}

*您可以在那里使用测试这个代码

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68498956

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档