使用 NEWTONSOFT 仅在根级别序列化对象

Posted

技术标签:

【中文标题】使用 NEWTONSOFT 仅在根级别序列化对象【英文标题】:Serialize object just root level with NEWTONSOFT 【发布时间】:2022-01-12 11:30:06 【问题描述】:

我有这样的课程:

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。您的代码无法编译。请贴出至少可以编译的真实代码。 检查这个 - ***.com/questions/45010583/… 您可以使用自定义合约解析器,如Serialize only simple types using Json.Net 所示。这是否回答你的问题?如果不能,您能否edit 澄清您需要哪些额外帮助? 【参考方案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

【讨论】:

以上是关于使用 NEWTONSOFT 仅在根级别序列化对象的主要内容,如果未能解决你的问题,请参考以下文章

Newtonsoft.Json.JsonSerializationException:'反序列化对象时出现意外标记:使用动态对象注释

使用 Newtonsoft Json 从流中反序列化多个 json 对象

您如何“真正”使用 Newtonsoft.Json 序列化循环引用对象?

如何使用 Newtonsoft.Json 正确反序列化数组中的嵌套对象? [复制]

Newtonsoft 反序列化到对象存储底层 JSON 作为属性

C#中使用Newtonsoft.Json序列化和反序列化自定义类对象