【问题标题】:Serialize object just root level with NEWTONSOFT使用 NEWTONSOFT 仅在根级别序列化对象
【发布时间】:2023-04-03 02:56:02
【问题描述】:

我有这样的课程:

public abstract class EntityBase 
{
    
    public long Id { get; set; }

    public DateTimeOffset CreationTimeUtc { get; set; }
    public DateTimeOffset? ModificationTimeUtc { get; set; }

}

public class State : EntityBase 
{
    public string Name { get; set; }
    public IList<City> Cities { get; set; }
}

public class City : EntityBase 
{
    public string Name { get; set; }
    public State State { get; set; }
    public long StateId { get; set; }
}

所以,我创建了一个状态变量

var state = new State()
        {
            Name = "State 1",
            CreationTimeUtc = DateTimeOffset.UtcNow,
            Id = Sequence.Generator.Next(),
            Cities = new List<City>()
            {
                new City()
                {
                    Id = Sequence.Generator.Next(),
                    CreationTimeUtc = DateTimeOffset.UtcNow,
                    Name = "City 1"
                }
            }
        };

当我使用NewTonSoft 序列化状态变量时,它会返回如下字符串:

{"name":"State 1","cities":[{"name":"City 1","stateId":"265439108547260417","id":"265439108547260419","creationTimeUtc":1638876015097,"modificationTimeUtc":1638876015097}],"id":"265439108547260417","creationTimeUtc":1638876015097,"modificationTimeUtc":1638876015097}

我只想创建根对象,在这种情况下我需要忽略 Cities 属性。 我不能在 Cities 属性上使用 [JsonIgnore] 属性。 我想使用JsonSerializerSettings 或类似的东西来生成json字符串。

更新

我用这段代码生成json字符串

var jsonSerializerSettings = new JsonSerializerSettings() { 
            ReferenceLoopHandling = ReferenceLoopHandling.Ignore,
        };
Newtonsoft.Json.JsonConvert.SerializeObject(state, jsonSerializerSettings);

我该怎么做!? 谢谢

【问题讨论】:

  • 为什么不能使用JsonIgnore
  • @LasseV.Karlsen 因为只是在这种情况下我想忽略这个属性,并不总是
  • 我在您的 State 类中看不到 CreationTimeUtc 和 Id。您的代码无法编译。请贴出至少可以编译的真实代码。
  • 您可以使用自定义合约解析器,如Serialize only simple types using Json.Net 所示。这是否回答你的问题?如果不能,您能否edit 澄清您需要哪些额外帮助?

标签: c# json .net-core json.net asp.net-core-3.1


【解决方案1】:

Json 只是一种在服务器之间移动数据的格式。它单独使用。要使用它,您需要反序列化它。随便用吧

var cities=state.Cities ;
state.Cities=null;

var json= JsonConvert.SerializeObject(state,Formatting.Indented,
      new JsonSerializerSettings { NullValueHandling = NullValueHandling.Ignore });

state.Cities=cities;

它在 Visual Studio 中进行了测试。这是json

{
  "name": "State 1",
  "id": "265439108547260417",
  "creationTimeUtc": 1638876015097,
  "modificationTimeUtc": 1638876015097
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-25
    • 1970-01-01
    相关资源
    最近更新 更多