c# - 如何提高我的 Json 解析代码的效率?
问题描述
我写了一些代码,它可以工作,但是我对json进行了两次双重转换,这有点尴尬。
我得到包装在“d”对象中的数据,我怎样才能立即得到它的内容
这是我得到的Json:
{
"d": [
{
"__type": "MdoCommonWs.WsStructures.WsWmsLookupResult",
"CallResult": {
"Id": 0,
"Data": null,
"ErrorId": 0,
"ErrorDescription": null
},
"Article": {
"Id": "001",
"Description": "ANKER M12 MECHANISCH",
"Unit": "pieces",
"UnitPrice": 7,
"MinStock": 0,
"MaxStock": 0,
"Info": "ANKER MECHANISCH M12",
"Photo": [],
"PhotoUrl": "",
"WeightUnit": "kg",
"Weight": 0.05,
"CountStock": 0
},
"Locations": [
{
"LocationId": "00.00.AA.01.01.01.02",
"Type": 0,
"IsBlocked": false,
"ArticleId": "001",
"Stock": 2,
"TotalStock": 2,
"LastActionDate": "/Date(1480334382093)/",
"LastInventoryDate": "/Date(1480334319527)/"
}
],
}],
}
这是我要转换的代码:
var rootJObject = JObject.Parse(stringSerialized);
var serialize = rootJObject["d"].ToString();
return JsonConvert.DeserializeObject<TResult>(serialize);
我怎样才能更有效地做到这一点?
解决方案
有很多方法可以做到这一点,这是我使用的:
public async Task<IEnumerable<TResult>> ParseJson<TResult>(string stringSerialized)
{
using (StringReader streamReader = new StringReader(stringSerialized))
using (JsonTextReader jsonTextReader = new JsonTextReader(streamReader))
{
JObject parsedData = await JObject.LoadAsync(jsonTextReader);
if (parsedData == null || parsedData["d"] == null || parsedData["d"].Children().Any() == false)
return new List<T>();
else
return parsedData["d"].Children().Select(s => s.ToObject<TResult>());
}
}
如果stringSerialized
来自 Stream,您可以提高效率,但只需直接处理该流,这样可以节省您将流转换为字符串以将字符串转换为对象的操作:
public async Task<IEnumerable<TResult>> ParseStream<TResult>(Stream contentStream)
{
using (StreamReader streamReader = new StreamReader(contentStream))
using (JsonTextReader jsonTextReader = new JsonTextReader(streamReader))
{
jsonTextReader.DateFormatString = _dateFormatString;
JObject parsedData = await JObject.LoadAsync(jsonTextReader);
if (parsedData == null || parsedData["d"] == null || parsedData["d"].Children().Any() == false)
return new List<TResult>();
else
return parsedData["d"].Children().Select(s => s.ToObject<TResult>());
}
}
务必Stream contentStream
使用using
.
对于非async
版本,只需替换:
JObject parsedData = await JObject.LoadAsync(jsonTextReader);
和
JObject parsedData = JObject.Load(jsonTextReader);
并将签名更改为:
public IEnumerable<TResult> ParseJson<TResult>
推荐阅读
- c - Should I redeclare a part of an external array for the use in a module
- android - Is it possible to make a wear app that connects to my android app activity(maps)
- mysql - 选择所有数据库中列的总和
- php - 如何在教义中使用左子句?
- azure - Azure 流分析的嵌套条件
- angular - Firebase 部署后显示“找不到页面”错误
- angular - 使用 ngModel 与输入/事件绑定、模板变量绑定和使用香蕉语法相比有什么优势 - 2 路绑定的方法
- java - 如何使用 java foreach json 或对象数据
- java - ArrayList - 如何更改 ArrayList 条目中的某个元素
- ios - SDWebImage 无法识别的选择器