Member 14779968 Ответов: 1

Как можно игнорировать или обрезать индексы из массива, когда я использую jsonfieldscollector?


В настоящее время у меня есть JsonFieldsCollector, который проверяет ответ Json, если это массив, объект/ свойство объекта, и сохраняет их в словаре и печатает их. но у меня есть один Json, подобный приведенному ниже, возвращенный с сервера

[
   {
    id:1
    name: "John"
   },
   {
    id:2
    name: "Bob"
   }
]


В настоящее время он печатается следующим образом
[0].id: 1
[0].имя : Джон
[1].id : 2
[2].имя : Боб

Я хочу распечатать без индекса []. как
id: 1
имя: Джон

//Вот класс JsonFieldsCollector
public class JsonFieldsCollector
  {
      private readonly Dictionary<string, JValue> fields;

      public JsonFieldsCollector(JToken token)
      {
          fields = new Dictionary<string, JValue>();
          CollectFields(token);
      }

      private void CollectFields(JToken jToken)
      {
          switch (jToken.Type)
          {
              case JTokenType.Object:
                  foreach (var child in jToken.Children<JProperty>())
                      CollectFields(child);
                  break;
              case JTokenType.Array:
                  foreach (var child in jToken.Children())
                      CollectFields(child);
                  break;
              case JTokenType.Property:
                  CollectFields(((JProperty)jToken).Value);
                  break;
              default:
                  fields.Add(jToken.Path, (JValue)jToken); //here is where it adding from indexes"[0].id"
                  break;
          }
      }

      public IEnumerable<KeyValuePair<string, JValue>> GetAllFields() => fields;



      public static void Usage(IRestResponse response)
      {
          var Json = JToken.Parse(response.Content);
          var fieldsCollector = new JsonFieldsCollector(Json);
          var fields = fieldsCollector.GetAllFields();
          foreach (var field in fields)
          {
              Console.WriteLine($"{field.Key}: {field.Value}");
          }

      }


Что я уже пробовал:

Не уверен, что смогу это сделать ... пожалуйста, любая помощь была бы очень кстати

1 Ответов

Рейтинг:
9

Garth J Lancaster

Ну, не обязательно правильный способ ее решения, но

default:
  fields.Add(jToken.Path, (JValue)jToken); //here is where it adding from indexes"[0].id"
  break;

может быть

default:
  // Needs a using System.Linq; 
  String pathLast = jToken.Path.Split('.').Last();
  String tokenLast = (JValue)jToken.Split('.').Last();

  fields.Add(pathLast, tokenLast); 
  break;


[Edit] - будет ли это работать ?
foreach (var field in fields)
{
  String keyLastSegment = field.Key.ToString().Split('.').Last();
  Console.WriteLine($"{keyLastSegment}: {field.Value}");
}
[/Редактировать]


Очевидно, что если вы десериализовали JSON в список "простой poco", содержащий два строковых поля, например tag, name, то вы также получите результат, и вам не нужно будет использовать этот механизм сбора полей - поскольку я не знаю, что еще вы можете делать с JSON, это может быть неподходящий метод


Member 14779968

Привет, Гарт, спасибо за твой ответ. Строка tokenLast = (JValue)jToken.Сплит('.').Последняя(); его дает ошибку мол нет способ разделения определяется по Jtoken.

Кроме того, моя главная причина для механизма сбора полей-получить все свойства и значения с сервера после попадания в API, а затем я хочу проверить класс объекта Model C# на нем и проверить, соответствует ли свойство и его значение/содержит то же самое, что и модель.

Кроме того, некоторые из ответов API имеют массив и объекты или смесь.. вот почему я подумал, что, возможно, добавление условия If будет трюком

Я сделал что-то вроде этого ... но мое условие if жестко закодировано, чтобы проверить только "[0]." и я получаю много индексов
если(jToken.Путь.Содержит("[0]."))
{
var output = RemoveBracketsandNumber(jToken.Путь);
поля.Add(output, (JValue)jToken);
}
еще
поля.Добавить(jToken.Path, (JValue)jToken); //вот где он добавляется из индексов"[0].id"
перерыв;
public static string RemoveBracketsandNumber(string str)
{
стр = регулярное выражение.Заменить(стр @"\[.+?\]", "");
ул. ул. =.Заменить(".", "");
возврат стр;
}

Garth J Lancaster

Я пил кофе, и у меня был момент "о-Нет" - вы идете в словарь, так что это не правильное место для такого преобразования в любом случае .. Я собираюсь изменить ответ

Смотрите правку, которую я сделал - на этапе вывода - надеюсь, что на этом объекте есть ToString()

Member 14779968

да это сделало свое дело Спасибо :)