Получить все значения из свойства с LINQ от JSON? - PullRequest
0 голосов
/ 06 апреля 2020

У меня проблемы с выбором точного синтаксиса для правильного запроса моего ответа JSON.

Моя конечная точка API возвращает примерно JSON следующим образом:

 {
  "status": "Succeeded",
  "recognitionResults": [
    {
      "page": 1,
      "clockwiseOrientation": 0.14,
      "width": 2835,
      "height": 2241,
      "unit": "pixel",
      "lines": [
        {
          "boundingBox": [
            25,
            11,
            324,
            15,
            323,
            51,
            24,
            46
          ],
          "text": "Custom Report",
          "words": [
            {
              "boundingBox": [
                37,
                11,
                171,
                14,
                172,
                49,
                38,
                48
              ],
              "text": "Custom"
            },
            {
              "boundingBox": [
                193,
                15,
                322,
                17,
                323,
                49,
                194,
                49
              ],
              "text": "Report"
            }
          ]
        }...

Важно отметить, что элемент root будет содержать только массив 1 recognitionResults. Внутри этого массива он будет содержать множество массивов lines. Внутри каждой строки у меня есть свойство text, у меня также будет свойство words, которое также содержит свойство text. Меня интересует только свойство text, которое является прямым потомком lines.

Я пытаюсь выделить все свойства text в список строк.

vb. net код:

File.WriteAllText(Path.GetFileName(strFilePath) & ".json", JToken.Parse(strResult).ToString())
Dim c1 As JArray = CType(tmpObj("recognitionResults"), JArray)
Dim c2 = (From s In c1.Children() Select s("text")).ToList()

Это исключение, что JArray имеет неверный ключ; ожидается int.

Я также подумал, что мог бы просто запросить его с помощью LINQ напрямую:

Dim c3 = (From s In tmpObj Select s("text")).ToList()

Это вызывает исключение, что он не может получить доступ к дочернему значению Newtonsoft.Json.Linq.Jproperty

Наконец, Я также попробовал это:

 Dim c2 = (From p In tmpObj("recognitionResults")("lines").Children() Select p("text"))

Я действительно застрял в этой точке. Я думаю, у меня просто есть проблема с синтаксисом в том, как я пытаюсь выбрать. Может ли кто-нибудь указать мне правильное направление?

1 Ответ

0 голосов
/ 06 апреля 2020

Вы можете использовать SelectTokens с символом подстановки, чтобы легче получить необходимую информацию от JSON:

Dim token As JToken = JToken.Parse(json)
Dim lines As List(Of String) = _
    (From t In token.SelectTokens("..lines[*].text") Select CStr(t)).ToList()

Рабочая демонстрация: https://dotnetfiddle.net/Zlenga

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...