反序列化大JSON数组并从中提取数据

时间:2017-09-04 11:32:23

标签: c# json json-deserialization

目前我正在开发一个使用Azure Media Indexing服务的项目(从视频中提取文本等)。索引后,我得到响应结果为json。通过这个网站(http://json2csharp.com/),我为我的项目创建了视图模型。我想从这个json中提取某些数据。现在问题是当我尝试解析json时,系统卡在反序列化行上。

基本上我试图像下面那样反序列化,

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

我已经尝试过几乎所有在stackoverflow中可用的代码片段,比如javascript序列化器,JSON.net等......我想也许是因为json的大小。我已将示例json上传到此处(http://myjson.com/1g74kx),这是我的VM(http://textuploader.com/d6218)。有人可以分析一下,让我知道如何解决这个问题吗?

谢谢你。

3 个答案:

答案 0 :(得分:0)

链接中的JSON不是数组,它是单个元素。最重要的是,您在RootObject类中包装了所有生成的类,包括类IndexedVideoReponseVM,但这不是正确的方法。

请删除包装类IndexedVideoReponseVM(保留所有内容),然后反序列化JSON,如下所示: JsonConvert.DeserializeObject<RootObject>(responseData)

当然,一旦有效,你可以给RootObject一个更合适的名字(json2sharp不能这样做,因为它没有关于外部对象的信息)。

答案 1 :(得分:0)

我认为你的JSON被双重引用了。我有一段时间有类似的问题,我尝试通过escaper处理后对其进行反序列化并且它对我有效:)你应该首先转义收到的JSON或者如果可以的话替换双引号。

答案 2 :(得分: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)");
        }
    }
}