【问题标题】:How to make JsonConvert.DeserializeObject<T>() parse array when I won't always be passing array to it?当我不总是将数组传递给它时,如何使 JsonConvert.DeserializeObject<T>() 解析数组?
【发布时间】:2020-07-05 15:15:47
【问题描述】:

我的 ASP.Net 应用程序中有一个方法,如下所示:

Method1<T>(String inputString)
{
  return JsonConvert.DeserializeObject<T>(inputString);
}

我将字符串化对象传递给Method1,其中一个是该对象的字符串化版本:

obj1: {
  a: ...
  b: [...]
}

即。 obj1 是一个以数组为属性的对象。现在,JsonConvert.DeserializeObject&lt;T&gt;(inputString) 不会解析该对象的数组部分。我从this post 了解到,如果type1obj1 的类型并且我做了JsonConvert.DeserializeObject&lt;type1&gt;(inputString),我可以完成这项工作。问题是我会将各种不同类型对象的字符串化版本传递给Method1,所以我不知道除了&lt;T&gt;之外还能怎么做。

有人知道我该如何处理吗?

【问题讨论】:

标签: asp.net .net deserialization json-deserialization jsonconvert


【解决方案1】:

Newtonsoft.Json.Linq api 非常适合这种场景。您可以将 json 解析为抽象的 JToken 对象,并查看令牌类型以确定如何提取数组。

public MyType[] GetArrayFromJson(string json)
{
    var token = JToken.Parse(json);

    if (token.Type == JTokenType.Array)
    {
        return token.ToObject<MyType[]>();
    }
    else if(token.Type == JTokenType.Object)
    {
        return token["arrayPropName"].ToObject<MyType[]>();
    }
}

【讨论】:

  • 嗨,尼尔,感谢您的回复。我已将输入字符串解析为 JToken,但我不确定如何处理该 JToken。看起来在您的代码中,您正在检查 JToken 本身是否是一个数组,或者它是否只包含一个数组,并在任何一种情况下都返回该数组。我想要做的只是返回对象本身,无论它是否包含数组。你知道怎么做吗?
  • @gkeenley 听起来你可能有一个xy problem。您现有的方法是用于反序列化对象,但如果我理解正确,您的对象类型并不都定义此数组属性(但数组仍将存在于您的 json 中)。您可能应该只创建一个单独的方法来在需要时提取您的数组。无需破解 1 行方法即可尝试重用它。如果我误解了,请告诉我
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-10-01
  • 2016-10-27
  • 2016-04-22
  • 1970-01-01
  • 2017-01-06
  • 1970-01-01
  • 2020-10-03
相关资源
最近更新 更多