反序列化大 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)");
}
}
}
目前我正在从事一个使用 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)");
}
}
}