2016-10-20 4 views
1

Вот что моя JSON строка выглядит следующим образом:JSON.Net - Другое извлечение данных из полиморфного JSon строки

{ 
    "?xml" : { 
     "@version" : "1.0", 
     "@encoding" : "UTF-8" 
    }, 
    "DataFeed" : { 
     "@FeedName" : "content", 
     "now" : "2016-10-17T14:11:38.00", 
     "Content" : [{ 
       "ContentData" : { 
        "@statusType" : "Published", 
        "@isReleased" : "Yes", 
        "@docId" : "21756", 
        "ProductStatus" : { 
         "@productCategory" : "Issuer", 
         "@focus" : "Issuer", 
         "Symbol" : { 
          "@PrimarySymbol" : "GOOGL", 
          "@SecondarySymbol" : "Google", 
          "@BmId" : "1790" 
         } 
        }, 
        "ContentVersion" : { 
         "@versionId" : "1", 
         "@lastVersion" : "true", 
         "@lastPublished" : "true", 
         "Url" : [{ 
           "@type" : "XML", 
           "@size" : "146410", 
           "#cdata-section" : "https://aaa.yyy.com/docs/xml/708893eb-1fd9-4278-8b0e-e7e0738d8105.xml" 
          }, { 
           "@type" : "HTML", 
           "@size" : "46105", 
           "#cdata-section" : "https://aaa.yyy.com/docs/html/708893eb-1fd9-4278-8b0e-e7e0738d8105.html" 
          }, { 
           "@type" : "PDF", 
           "@size" : "1274885", 
           "#cdata-section" : "https://aaa.yyy.com/docs/pdf/708893eb-1fd9-4278-8b0e-e7e0738d8105.pdf" 
          }, { 
           "@type" : "ALTERNATE PDF", 
           "@size" : "60960", 
           "#cdata-section" : "https://aaa.yyy.com/docs/shortPdf/708893eb-1fd9-4278-8b0e-e7e0738d8105.pdf" 
          } 
         ] 
        } 
       } 
      }, { 
       "ContentData" : { 
        "@statusType" : "Published", 
        "@isReleased" : "Yes", 
        "@docId" : "22457", 
        "ProductStatus" : { 
         "@productCategory" : "Issuer", 
         "@focus" : "Issuer", 
         "Symbol" : { 
          "@PrimarySymbol" : "AAPL", 
          "@SecondarySymbol" : "Apple", 
          "@BmId" : "1121" 
         } 
        }, 
        "ContentVersion" : [{ 
          "@versionId" : "1", 
          "@lastVersion" : "false", 
          "@lastPublished" : "false", 
          "Url" : [{ 
            "@type" : "XML", 
            "#cdata-section" : "https://aaa.yyy.com/docs/version/708893eb-1fd9-4278-8b0e-e7e0738d8105.1476742297.xml" 
           }, { 
            "@type" : "HTML", 
            "#cdata-section" : "https://aaa.yyy.com/docs/version/708893eb-1fd9-4278-8b0e-e7e0738d8105.1476742297.html" 
           }, { 
            "@type" : "PDF", 
            "#cdata-section" : "https://aaa.yyy.com/docs/version/708893eb-1fd9-4278-8b0e-e7e0738d8105.1476742297.pdf" 
           }, { 
            "@type" : "ALTERNATE PDF", 
            "#cdata-section" : "https://aaa.yyy.com/docs/version/708893eb-1fd9-4278-8b0e-e7e0738d8105.1476742297_short.pdf" 
           } 
          ] 
         }, { 
          "@versionId" : "2", 
          "@lastVersion" : "true", 
          "@lastPublished" : "true", 
          "Url" : [{ 
            "@type" : "XML", 
            "@size" : "174520", 
            "#cdata-section" : "https://aaa.yyy.com/docs/xml/708893eb-1fd9-4278-8b0e-e7e0738d8105.xml" 
           }, { 
            "@type" : "HTML", 
            "@size" : "46105", 
            "#cdata-section" : "https://aaa.yyy.com/docs/html/708893eb-1fd9-4278-8b0e-e7e0738d8105.html" 
           }, { 
            "@type" : "PDF", 
            "@size" : "1270150", 
            "#cdata-section" : "https://aaa.yyy.com/docs/pdf/708893eb-1fd9-4278-8b0e-e7e0738d8105.pdf" 
           }, { 
            "@type" : "ALTERNATE PDF", 
            "@size" : "60960", 
            "#cdata-section" : "https://aaa.yyy.com/docs/version/708893eb-1fd9-4278-8b0e-e7e0738d8105.1577742297_short.pdf" 
           } 
          ] 
         } 
        ] 
       } 
      }, { 
       "ContentData" : { 
        "@statusType" : "Published", 
        "@isReleased" : "Yes", 
        "@docId" : "22501", 
        "ProductStatus" : { 
         "@productCategory" : "Issuer", 
         "@focus" : "Issuer", 
         "Symbol" : [{ 
           "@PrimarySymbol" : "AAA", 
           "@SecondarySymbol" : "Some name 1", 
           "@BmId" : "561" 
          }, { 
           "@PrimarySymbol" : "ABC", 
           "@SecondarySymbol" : "Some Name 2", 
           "@BmId" : "29" 
          }, { 
           "@PrimarySymbol" : "BBB", 
           "@SecondarySymbol" : "Some Name 3", 
           "@BmId" : "36" 
          }, { 
           "@PrimarySymbol" : "CCC", 
           "@SecondarySymbol" : "Some Name 4", 
           "@BmId" : "624" 
          } 
         ] 
        }, 
        "ContentVersion" : { 
         "@versionId" : "1", 
         "@lastVersion" : "true", 
         "@lastPublished" : "true", 
         "Url" : [{ 
           "@type" : "XML", 
           "@size" : "2706269", 
           "#cdata-section" : "https://aaa.yyy.com/docs/xml/1c420081-0ce5-4959-91d3-848bbbccd3e3.xml" 
          }, { 
           "@type" : "HTML", 
           "@size" : "32445", 
           "#cdata-section" : "https://aaa.yyy.com/docs/html/1c420081-0ce5-4959-91d3-848bbbccd3e3.html" 
          }, { 
           "@type" : "PDF", 
           "@size" : "887608", 
           "#cdata-section" : "https://aaa.yyy.com/docs/pdf/1c420081-0ce5-4959-91d3-848bbbccd3e3.pdf" 
          }, { 
           "@type" : "ALTERNATE PDF", 
           "@size" : "34366", 
           "#cdata-section" : "https://aaa.yyy.com/docs/shortPdf/1c420081-0ce5-4959-91d3-848bbbccd3e3.pdf" 
          } 
         ] 
        } 
       } 
      } 
     ] 
    } 
} 

Я после примера кода из LINQ to Json data retrieval from polymorphic json. Я хочу, чтобы выбрать следующее, но только при наличии одного эмитента в Symbol разделе и PDF URL для последней версии:

  • @docId
  • @PrimarySymbol
  • @BmId
  • #cdata-section (но только для PDF-файлов для последняя версия)

Вот как выглядит мой запрос:

from content in jsonFeed.SelectTokens("DataFeed.Content").SelectMany(i => i.ObjectsOrSelf()) 
let issuer = content 
     .SelectToken("[email protected]") 
     .SingleOrMultiple() 
     .Select(t => (string)t) 
     .ToArray() 
where issuer.FirstOrDefault().Equals("Issuer") 
select new 
{ 
    DocID = (string)content.SelectToken("[email protected]"), 
    Symbol = (string)content.SelectToken("[email protected]"), 
    BMId = (int)content.SelectToken("[email protected]"), 
    PDFUrl = (string)content.SelectToken("ContentData.ContentVersion.Url[3].#cdata-section") 
}).ToList(); 

Сейчас я могу получить все поля для Google, но я не могу получить PDFUrl для Apple (потому что я не знаю, как добраться до последней версии). Кроме того, как я могу выполнить предложение Where, так что он будет выбирать только документы с 1 символом? Так, в конце концов, мой список будет изображение ниже:

Results

+0

Вы хотите, чтобы URL-адрес «@type»: «PDF» или URL-адрес «@type»: «ALTERNATE PDF»? Потому что вы в настоящее время получаете значение индекса 3, который является альтернативным URL-адресом PDF. – dbc

+0

Просто '' @type ":" PDF ".' –

ответ

1

Вы можете комбинировать let и where для расчета и фильтрации на промежуточных результатов.

Следующий запрос использует эту технику, а также запросов для URL с @type равным "PDF", а не жестко прописывать его быть индексом 3 (это на самом деле с индексом 2, кстати):

string pdfUrlType = "PDF"; 
var query = 
    (from content in jsonFeed.SelectTokens("DataFeed.Content").SelectMany(i => i.ObjectsOrSelf()) 
    let issuer = content 
      .SelectToken("[email protected]") 
      .SingleOrMultiple() 
      .Select(t => (string)t) 
      .ToArray() 
    where issuer.FirstOrDefault().Equals("Issuer") 
    // Get the @PrimarySymbol where there is exactly one, or null otherwise. 
    let symbol = (string)content.SelectToken("[email protected]") 
    // Skip content without a single primary symbol 
    where symbol != null 
    // Get the last ContentVersion record in the JSON document. 
    let lastContentVersion = content 
     .SelectToken("ContentData.ContentVersion") 
     .SingleOrMultiple() 
     .Where(v => (bool?)v.SelectToken("@lastVersion") == true) 
     .LastOrDefault() 
    // Skip content with no ContentVersion 
    where lastContentVersion != null 
    // Get the PDF Url record 
    let pdfUrl = lastContentVersion.SelectToken("Url") 
     .SingleOrMultiple() 
     .Where(u => (string)u.SelectToken("@type") == pdfUrlType) 
     .FirstOrDefault() 
    // Skip content with no PDF Url record 
    where pdfUrl != null 
    select new 
    { 
     DocID = (string)content.SelectToken("[email protected]"), 
     Symbol = symbol, 
     BMId = (int?)content.SelectToken("[email protected]"), 
     PDFUrl = (string)pdfUrl.SelectToken("#cdata-section") 
    }).ToList(); 

Если вы действительно хотите альтернативный PDF URL вместо этого, установите

string pdfUrlType = "ALTERNATE PDF"; 

fiddle образца.

Если вы уверены, что последняя версия ContentVersion в каждой "Content" записи (тот, для которого "@lastVersion" равна "true") гарантированно будет последним по порядку документов, можно упростить запрос следующим образом:

 let lastContentVersion = content 
     .SelectToken("ContentData.ContentVersion") 
     .SingleOrMultiple() 
     .LastOrDefault() 
+0

Спасибо, @dbc. –

 Смежные вопросы

  • Нет связанных вопросов^_^