#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