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

Deserialize Big JSON Array and extracting data from it

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

基本上我尝试像下面这样反序列化,

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

我已经尝试了 Whosebug 中几乎所有可用的代码片段,例如 javascript 序列化程序、JSON.net 等...我认为这可能是因为 json 的大小。我已将示例 json 上传到此处 (http://myjson.com/1g74kx) and here is my VM (http://textuploader.com/d6218)。有人可以分析一下并告诉我如何解决吗?

谢谢。

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

请移除包装 class IndexedVideoReponseVM(保留里面的所有内容),然后像这样反序列化 JSON:JsonConvert.DeserializeObject<RootObject>(responseData).

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

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

你应该这样反序列化:

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 whosebug.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)");
        }
    }
}