【问题标题】:How do I call an object property with empty property name?如何调用具有空属性名称的对象属性?
【发布时间】:2017-10-28 02:15:42
【问题描述】:

我有以下 JSON,但我无法控制它,因为它来自外部 API:

    {
  "user_id": "something_name",
  "devices": {
    "": {
      "sessions": [
        {
          "connections": [
            {
              "ip": "225.225.225.225",
              "user_agent": "something",
              "last_seen": 1504266816737
            }
        }
      ]
    }
  }
}

我正在使用 JSON 反序列化器 (JSON.Net) 使其成为动态对象。

dynamic values = JsonConvert.DeserializeObject<dynamic>(mes);

问题是,其中一个 json 键是一个空字符串“”。现在我似乎无法这样称呼该属性:

values.devices.<the empty string part>.sessions.connections

当顶部键之一为空时,我如何调用它下面的东西? 做devices..sessions 没有用。

【问题讨论】:

标签: c# .net json json.net dynamicobject


【解决方案1】:

您可以使用方括号语法来访问具有空键的属性。例如:

dynamic ip = values.devices[""].sessions[0].connections[0].ip;

小提琴:https://dotnetfiddle.net/H4orMZ

【讨论】:

    【解决方案2】:

    我发现的第一个问题:您的样本存在不平衡的括号:
    "connections": [ 之后没有关闭]

    无论如何,这是可行的:

    ...使用这样的动态对象:

    dynamic values = JsonConvert.DeserializeObject<dynamic>(json);
    var ip = values.devices[""].sessions[0].connections[0].ip;
    

    ...具有如下所示的自定义类定义:

    public class RootObject
    {public string user_id { get; set; }
        public Dictionary<string, Devices> devices { get; set; }
    }
    public class Devices
    {
        public List<Session> sessions { get; set; }
    }
    public class Session
    {
        public List<Connections> connections { get; set; }
    }
    public class Connections
    {
        public string ip { get; set; }
        public string user_agent { get; set; }
        public long last_seen { get; set; }
    }
    

    所以,Devices Key 是一个空字符串 - 但没关系。

    现场试用here。 输出:

    Deserializing json...
    Success!
      Device Key   #: 
      Device Value #: Devices
                IP #: 225.225.225.225 (just a sample sub-property)
    
    using System;
    using Newtonsoft.Json;
    using System.Collections.Generic;
    

    完整代码:

    public class Program
    {
        public static void Main()
        {
            string json = @"{
                              ""user_id"": ""something_name"",
                              ""devices"": {
                                """": {
                                  ""sessions"": [
                                    {
                                      ""connections"": [
                                        {
                                          ""ip"": ""225.225.225.225"",
                                          ""user_agent"": ""something"",
                                          ""last_seen"": 1504266816737
                                        }
                                      ]
                                    }
                                  ]
                                }
                              }
                            }";
    
            Console.WriteLine("Deserializing json...");
    
            //dynamic values = JsonConvert.DeserializeObject<dynamic>(json);
            //var ip = values.devices[""].sessions[0].connections[0].ip;
    
            RootObject o = JsonConvert.DeserializeObject<RootObject>(json, new JsonSerializerSettings
            {
                MissingMemberHandling = MissingMemberHandling.Ignore, 
                NullValueHandling = NullValueHandling.Ignore //these settings are not important here
            });
            Console.WriteLine("Success!");
            foreach (var dev in o.devices)
            {
                Console.WriteLine("  Device Key   #: {0}", dev.Key);
                Console.WriteLine("  Device Value #: {0}", dev.Value);
                Console.WriteLine("            IP #: {0}", dev.Value.sessions[0].connections[0].ip);
            }
        }
    }
    
    public class RootObject
    {public string user_id { get; set; }
        public Dictionary<string, Devices> devices { get; set; }
    }
    public class Devices
    {
        public List<Session> sessions { get; set; }
    }
    public class Session
    {
        public List<Connections> connections { get; set; }
    }
    public class Connections
    {
        public string ip { get; set; }
        public string user_agent { get; set; }
        public long last_seen { get; set; }
    }
    

    【讨论】:

      【解决方案3】:

      解决这个问题的最好方法是修改mes字符串,如:

      string modifiedmes = mes.Replace("","prop");
      
      dynamic values = JsonConvert.DeserializeObject<dynamic>(modifiedmes);
      

      我想那你就可以访问了

      values.devices.prop.sessions.connections
      

      【讨论】:

      • Replace() 的调用会引发ArgumentException,因为您无法通过空搜索string。您需要在搜索和替换文本周围加上引号:mes.Replace("\"\"","\"prop\"")。此外,如果输入 JSON 包含设置为空字符串的属性,这也将替换该值。
      • 进行字符串替换绝对是不是“最好的方法”。
      猜你喜欢
      • 2022-01-17
      相关资源
      最近更新 更多