Получите значение свойства объекта, имя которого начинается с числа

#c# #object #dynamic

Вопрос:

Я получаю данные с веб-сайта, который возвращает мне объект в строке, подобной этой:

 {
    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 (), используя какое-то регулярное выражение или что-то в этом роде, но этого я хочу избежать.

Комментарии:

1. Почему бы не разобрать это на соответствующие объекты C#? Это значительно облегчает задачу.

2. Кроме того, это свойство числа, о котором вы говорите, в основном является просто словарным ключом int

3. Также знайте, что каждый раз , когда вы используете этот тип dynamic , вы обычно решаете проблему, создавая 2 или более других проблем

4. Каждый раз , когда вы используете dynamic , котенок умирает…

Ответ №1:

Вы действительно должны разбирать JSON на конкретные классы C#. Динамика работает медленно и уязвима для ошибок во время выполнения, которые трудно обнаружить. Комментарии войдут в Словарь. Например:

 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);
 

Теперь вы можете очень легко получить доступ к комментариям:

 var commentText = result.FeedComments[3465665].Text