【问题标题】:Get the value of the property of the object whose name begins with a number获取名称以数字开头的对象的属性值
【发布时间】:2021-11-03 09:53:45
【问题描述】:

我正在从网站获取数据,该数据以 string 形式返回给我一个对象,如下所示:

{
    index: 1,
    commentNumber: 20,
    feedComments: {
        3465665: {
            text: "I do not agree",
            likeRatio: 0
        },
        6169801: {
            text: "Hello",
            likeRatio: 12
        },
        7206201: {
            text: "Great job!",
            likeRatio: 5
        }
    }
}

我想把它作为一个对象来工作,这很容易做到,我就这样做:

string objectString = GetData(); // Artificial GetData() method
dynamic data = JObject.Parse(objectString);

现在我可以使用 dynamic

轻松地从该对象中获取我想要的所有属性

现在问题很明显了,我想获取名称以数字开头的属性(我获取的对象数据结构就是这样设计的)。但是您从对象获得的属性/字段名称不能以数字开头。

int commentNumber = data.commentNumber; // Works fine

string commentText = data.feedComments.3465665.text; // Obviously won't compile

有什么办法吗?

请注意,我想处理我获取的数据,因为它是一个对象,我知道我可以从 GetData() 方法使用一些正则表达式或其他东西返回的字符串中获取注释文本,但这是我想避免的。

【问题讨论】:

  • 为什么不把它解析成合适的 C# 对象呢?它让一切变得更容易处理。
  • 另外你说的这个数字属性基本上就是一个int的字典键
  • 另外知道,每次你使用dynamic这个类型,你通常是通过创建2个或更多其他问题来解决一个问题
  • 每次使用dynamic,都会有一只小猫死去……

标签: c# object dynamic


【解决方案1】:

您确实应该将 JSON 解析为具体的 C# 类。 Dynamic 很慢并且容易受到难以检测的运行时错误的影响。 cmets 将进入字典。例如:

public class Root
{
    public int Index { get; set; }
    public int CommentNumber { get; set; }
    public Dictionary<long, FeedComment> FeedComments { get; set; }
}

public class FeedComment
{
    public string Text { get; set; }
    public int LikeRatio { get; set; }
}

然后像这样反序列化:

var result = JsonConvert.DeserializeObject<Root>(objectString);

现在您可以非常轻松地访问 cmets:

var commentText = result.FeedComments[3465665].Text

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-08-14
    • 1970-01-01
    • 2017-04-04
    • 2012-11-16
    • 1970-01-01
    相关资源
    最近更新 更多