目前我正在开发一个使用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)。有人可以分析一下,让我知道如何解决这个问题吗?
谢谢你。
答案 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)");
}
}
}