【问题标题】:How to get element in JSON string如何获取 JSON 字符串中的元素
【发布时间】:2019-03-02 00:04:58
【问题描述】:

我有这个 JSON 字符串,称为受理人:

{
    "id": 15247055788906,
    "gid": "15247055788906",
    "name": "Bo Sundahl",
    "resource_type": "user"
}

如果它不为空,我想获取“名称”元素及其值。我试过了

var jobject = JsonConvert.DeserializeObject<JObject>(assignee);

还有

var jo = JObject.Parse(assignee);

我尝试循环遍历它,但我只是得到空异常或空输出,即使我只是打印受让人变量本身,它填充了数据。

我的循环是这样的:

foreach (var result in jobject["name"])
{
    Debug.WriteLine(result);
}

【问题讨论】:

  • 将其解析为适当的 C# 类而不是 JObject,这样所有这些复杂性都会消失。
  • 这么小的数据真的没必要,string name = jobject["name"];够了
  • 虽然有很多好处。编译时类型检查是显而易见的。然而,有一些不太明显的,例如代码的可读性。
  • @fasola 这不是关于方法的冗长,而是关于处理它的正确方法。这就是为什么我删除了我的答案并赞成大卫的
  • 还有一点需要注意的是,反序列化到具体类的速度几乎是使用 JObject 的两倍。

标签: c# json


【解决方案1】:

最简单最好的方法是反序列化为C#类,例如:

public class Data
{
    public long Id { get; set; }
    public string Name { get; set; }
    //etc..
}

然后像这样反序列化

var data = JsonConvert.DeserializeObject<Data>(json);
var name = data.Name;

【讨论】:

  • 赞成...但是,如果传入的数据是“脏”的并且您不知道所有表格,那么这种方法可能会出现问题。
  • @Clay OP 特别需要 Name 属性,所以这里不用担心。
  • 同意 - 只是提出一个小问题。我同意这是最好的方法……出于可维护性和性能的原因。我在不知道来源的情况下经历了较大 json 字符串的脏数据。很不满意:-(
  • 不知道属性是否存在的一种解决方法是使用带有元数据的包装 json 包{ "type" : "myType1", "Payload" : "{ inner json payload}" } 这当然假设您控制调用者
【解决方案2】:

要获取名称,请使用此

string name = jobject["name"];

【讨论】:

    【解决方案3】:

    使用["name"]返回JToken,如果属性不存在则为null

    JToken token = jo["name"];
    Debug.WriteLine(token?.ToString() ?? "<default value>");
    

    【讨论】:

      【解决方案4】:

      如果你事先不知道属性,你可以遍历 JObject 的属性并获取名称值对,如下所示:

      var jsonObject = JObject.Parse(str);
      foreach (var item in jsonObject)
      {
         var name = item.Key;
         JToken token = item.Value;
         if (token is JValue)
         {
            var value = token.Value<string>();
         }
      }
      

      【讨论】:

        【解决方案5】:

        这是它的工作原理:

        class Data
          {
            public long? Id { get; set; }
            public string Gid { get; set; }
            public string Name { get; set; }
            public string Resource_Type { get; set; }
          }
          class Program
          {
            static void Main(string[] args)
            {
        
              string assignee = "{\"id\": 15247055788906, \"gid\": \"15247055788906\", \"name\": \"Bo Sundahl\", \"resource_type\": \"user\"}";
              Data data = JsonConvert.DeserializeObject<Data>(assignee);
              Console.WriteLine(data.Id);
              Console.WriteLine(data.Gid);
              Console.WriteLine(data.Name);
              Console.WriteLine(data.Resource_Type);
              Console.ReadLine();
            }
          }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2012-08-29
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-01-28
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多