2017-09-04 141 views
0

目前我正在使用Azure媒體索引服務(從視頻中提取文本等)的項目。索引後,我得到的響應結果爲json。有了這個網站(http://json2csharp.com/),我爲我的項目創建了視圖模型。我想從這個JSON中提取某些數據。現在的問題是,當我嘗試解析JSON時,系統卡在反序列化行上。反序列化大JSON數組並從中提取數據

基本上我試圖反序列化像下面,

IList<IndexedVideoReponseVM> modelObj = JsonConvert.DeserializeObject<IList<IndexedVideoReponseVM>>(responseData); 

我已經嘗試了幾乎所有的代碼片段提供計算器像JavaScript串行,JSON.net等等。我認爲它是因爲規模的可能json。我已經將示例json上傳到這裏(http://myjson.com/1g74kx),這裏是我的VM(http://textuploader.com/d6218)。有人可以分析一下,讓我知道如何解決這個問題嗎?

謝謝你。

回答

0

鏈接上的JSON不是數組,它是一個單獨的元素。最重要的是,您將所有生成的課程包括在IndexedVideoReponseVM課程中,其中包括RootObject課程,但這不是正確的方法。

請拆除包裝類IndexedVideoReponseVM(保留一切在裏面),然後反序列化JSON的是這樣的:JsonConvert.DeserializeObject<RootObject>(responseData)

當然,一旦這個工作,你可以給RootObject一個更合適的名稱(json2sharp不能這樣做,因爲它沒有關於外部對象的信息)。

+0

是碰到我的腦海裏,並試圖它。但我找不到如何從結果對象中提取數據(請參閱https://ibb.co/daB1KF)。 – locknies

+0

@KRIZTE你所有的JSON字符串都應該放在一個大的方括號中作爲列表。 –

+0

@Abdullah,你是否建議我應該這樣做?? IndexedVideoReponseVM modelObj = JsonConvert.DeserializeObject (「[」+ responseData +「]」);仍然沒有運氣.. – locknies

0

我認爲它已經做了與你的JSON被雙引號的東西。我曾經有過類似的問題,我嘗試通過escaper對它進行反序列化,它對我有用:)你應該首先逃避接收到的JSON,或者如果可以的話,換成雙引號。

+0

這是你的意思嗎? JsonConvert.DeserializeObject (responseData。取代(「」「‘\’」)) – locknies

+0

Backspace鍵替換爲\ b 換行符替換\ n 選項卡被替換\噸 回車替換\ r 形式進料被替換\˚F 雙引號替換爲\」 反斜槓被替換爲\\ 順便說一句,爲什麼你的類這樣定義呢?在你的類我只看到嵌套類的聲明。沒事就好定義的屬性。我不能瞭解的一些新方法以組合的方式定義類和屬性? –

+0

我的解決方案可能是錯誤的,因爲我剛剛看到它是一個序列化的空對象,不是合適的,它沒有任何屬性。 –

0

你應該反序列化這樣的:

var obj = JsonConvert.DeserializeObject<IndexedVideoReponseVM.RootObject>(str); 

代碼執行在435毫秒(小於1秒)

完整的代碼示例:

using System; 
using System.Diagnostics; 
using System.Threading; 
using Newtonsoft.Json; 

namespace ConsoleApp12 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 


      var str = @"{ 
    ""accountId"": ""496c-aed1-ab750d882fa5"", 
    ""id"": ""acd8121234"", 

//i've cut most part of text couse of stackoverflow.com limitation on 30000 symbols. Code was tested with full json 

    ""social"": { 
    ""likedByUser"": false, 
    ""likes"": 0, 
    ""views"": 0 
    } 
}"; 

      var sw = Stopwatch.StartNew(); 
      var obj = JsonConvert.DeserializeObject<IndexedVideoReponseVM.RootObject>(str); 
      sw.Stop(); 
      Console.WriteLine($"Deserialized at {sw.ElapsedMilliseconds} ms ({sw.ElapsedTicks} tiks)"); 
     } 
    } 
}