首页 > 解决方案 > 如何提高我的 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);

我怎样才能更有效地做到这一点?

标签: c#json

解决方案


有很多方法可以做到这一点,这是我使用的:

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>

推荐阅读