【问题标题】:Why is Newtonsoft.Json.JsonConvert.SerializeObject adding "_repository" to each item in my list?为什么 Newtonsoft.Json.JsonConvert.SerializeObject 将“_repository”添加到我列表中的每个项目?
【发布时间】:2019-11-01 19:06:45
【问题描述】:

我有一个看起来像这样的简单方法:

public partial class PEUploadBookHistory: DataAccessBase
{
    public string Get()
    {
        List<PEUploadBookHistory> histories = _repository.GetList<PEUploadBookHistory>().ToList();
        string jsonHistories = JsonConvert.SerializeObject(histories);
        return jsonHistories;
    }
    
    // Other methods like Post and Put, etc
}

_repository.GetList 是一个 Dapper 存储库:

public IEnumerable<T> GetList<T>()
{
    IEnumerable<T> entities;
    using (var connection = OpenConnection(_connectionStringName))
    {
        entities = connection.GetList<T>();
    }
    return entities;
}

第一种方法返回的json字符串如下所示:

[
  {
    "_repository": {},
    "UploadBookHistoryId": 5467,
    ... other properties ...
  }
]

我不明白为什么要添加"_repository": {},。不应该是PEUploadBookHistory吗?那是从哪里来的?为什么?我该如何改变它?

这是其余的部分:

[Table("PE_UploadBookHistory")]
public partial class PEUploadBookHistory
{
    [Key]
    public virtual int UploadBookHistoryId { get; set; }
    ... other columns ...
}

这里是DataAccessBase

public class DataAccessBase
{
    public Repository _repository = new Repository("SQLConnection");
}

【问题讨论】:

  • 你能告诉我们PEUploadBookHistory的定义吗?
  • 完成。谢谢你:)
  • 没有什么特别突出的,但它是一个部分类。在某个地方是否还有定义的另一部分?您的代码是否在任何地方包含“_repository”?它的行为就像有一个名为 _repository 的公共属性或字段。这是最有可能的解释……如果不是这样,那我真的不确定。
  • 啊,您的connection.GetList&lt;T&gt;(); 调用必须返回一个包含该属性的对象。我原以为您收到的是List&lt;T&gt;,但事实并非如此。
  • 谢谢艾米。我编辑了 OP 以显示这一点。也许再从头开始。

标签: c# .net json json.net


【解决方案1】:

JsonIgnore装饰这个属性:

[JsonIgnore]
public Repository _repository = new Repository("SQLConnection");

或者,您可以将其设为非公开。

或者,对数据库和 JSON 使用不同的模型。

如果这些解决方案都不起作用,您可以使用自定义 Json 合同类,这将需要更多的工作来组合。

【讨论】:

  • 如果我将其设为非公开,会是什么?私人的?密封?我在这两个方面都遇到了其他问题。
  • 默认情况下 Newtonsoft 只序列化公共属性。你可以试试protectedinternal,虽然我不确定 Newtonsoft 是否处理内部道具。
  • 其实没有问题! [JsonIgnore] 工作。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-12-22
  • 1970-01-01
  • 1970-01-01
  • 2021-05-18
  • 2018-02-23
  • 2017-12-17
  • 2021-06-29
相关资源
最近更新 更多