【问题标题】:Why does my JObject to Model Conversion return null?为什么我的 JObject 到模型转换返回 null?
【发布时间】:2019-01-14 04:47:12
【问题描述】:

我正在尝试将一个非常简单的 JObject 转换为 C# 模型对象,但由于某种原因,我得到的只是 null。

对象模型如下所示

public class PerfectFit
{
    public Array Categories { get; set; }
}

转换器也这么简单

public static PerfectFit PerfectFitTopLevelFormat(IQueryable<JObject> unformattedQueryOutput)
{

    //var jongel = unformattedQueryOutput.ToList();


    PerfectFit formattedQueryOuput = Newtonsoft.Json.JsonConvert.DeserializeObject<PerfectFit>(unformattedQueryOutput.ToList().ToString());


    return formattedQueryOuput;
}

我这样调用转换器方法

PerfectFit formattedQueryOutput = ReFormatQueryOutput.PerfectFitTopLevelFormat(queryResultSet);
return Ok(formattedQueryOutput);

queryResultSet 检索如下

IQueryable<JObject> queryResultSet = client.CreateDocumentQuery<JObject>(UriFactory.CreateDocumentCollectionUri(brandDbInfo.DbName, brandDbInfo.DbCollection), queryElementInfo.SqlStatement, queryOptions);

如果我只是返回 queryResultSet.ToList();我得到以下内容

[
    {
        "topLevelCat": "Barn"
    },
    {
        "topLevelCat": "Dam"
    },
    {
        "topLevelCat": "Herr"
    },
    {
        "topLevelCat": "Divided"
    }
]

所以我知道数据可以从我的数据源中正常返回,但我无法将转换为我的简单模型。

我在这里错过了什么?

【问题讨论】:

  • 为什么这样做unformattedQueryOutput.ToList().ToString(),只需提供unformattedQueryOutput。或者使Categories 成为一个列表而不是一个数组。我想你可以看到我要去哪里,你正在尝试反序列化为不同的类型。
  • 反序列化器需要一个字符串,还是我遗漏了什么?最终结果必须是一个数组,所以我可能对转换能够做什么有点困惑

标签: c# arrays json model json.net


【解决方案1】:

您的 JSON 表示一个对象数组,其中每个对象都包含一个名为 toplevelCat 的字符串属性。您正在尝试反序列化为包含名为Categories 的数组的单个对象。由于您的模型与 JSON 不匹配,因此无法正常工作。像这样制作你的模型:

public class PerfectFit
{
    public string TopLevelCat { get; set; } 
}

您可以像这样从 JSON 字符串反序列化为 List&lt;PerfectFit&gt;

List<PerfectFit> list = JsonConvert.DeserializeObject<List<PerfectFit>>(json);

小提琴:https://dotnetfiddle.net/syULkn

如果您从IQueryable&lt;JObject&gt; 开始,您应该可以执行以下操作:

List<PerfectFit> list = queryResultSet.ToList()
    .Select(jo => jo.ToObject<PerfectFit>()).ToList();

小提琴:https://dotnetfiddle.net/5JS1gX

【讨论】:

  • 好的,我现在唯一的问题是我无法从 IqueryAble 转到反序列化器所需的字符串
  • @Matt Douhan 我已经更新了我的答案。出于好奇,您为什么要使用JObject 作为中介?为什么不直接将查询结果具体化到模型中,即使用IQueryable&lt;PerfectFit&gt;
猜你喜欢
  • 1970-01-01
  • 2018-02-10
  • 1970-01-01
  • 1970-01-01
  • 2022-01-10
  • 2020-06-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多