Newtonsoft 反序列化到对象存储底层 JSON 作为属性
Posted
技术标签:
【中文标题】Newtonsoft 反序列化到对象存储底层 JSON 作为属性【英文标题】:Newtonsoft Deserialize to Object Store Underlying JSON as property 【发布时间】:2018-09-18 06:26:59 【问题描述】:我正在使用 Newtonsoft 将 JSON 从 REST 调用反序列化为 C# 对象。该对象是一个人员列表。 Person 有很多属性,但现在我只存储其中的一些。我想在 Person 上有一个字符串属性,其中包含构成整个人的 JSON。有没有办法做到这一点?我现在正在将其写回 SQL 数据库,我不需要这些值,但希望在需要时将其保留以备将来使用。
对象类
public class Worker
public string associateOID get; set;
public WorkerID workerID get; set;
public Person person get; set;
public WorkerDates workerDates get; set;
public WorkerStatus workerStatus get; set;
public List<WorkAssignment> workAssignments get; set;
public CustomFieldGroup customFieldGroup get; set;
public BusinessCommunication businessCommunication get; set;
public string JSON get; set;
public class Meta
public int totalNumber get; set;
public class WorkerResult
public List<Worker> workers get; set;
public Meta meta get; set;
我现有的反序列化调用:
WorkerResult result = JsonConvert.DeserializeObject<WorkerResult>(json);
【问题讨论】:
当然可以。你有什么问题?你有写代码吗? 我更新了我的原始文件以包含对象类和我的反序列化代码。不太确定从那里去哪里。没有看到任何属性。 使用 NewtonSoft,这很简单。只需将您班级的JSON
属性设置为JsonConvert.SerializeObject
。
在我的 Worker 类中,我只从 JSON 中获取一些属性,但想要存储所有带有数据库属性的 JSON。
自定义JsonConverter
是可行的,但[JsonExtensionData]
会更好地满足您的需求吗?见How to serialize a Dictionary as part of its parent object using Json.Net 和Deserialize json with known and unknown fields。
【参考方案1】:
我认为您的意思是要将 JSON 中的所有属性存储到您的 c# 对象中 - 以便您以后可以在需要时访问它们。
为此,您可以使用[JsonExtensionData]
注释。
public class Worker
public string associateOID get; set;
// Any other attributes that you want to use as .NET types go here
// all attributes that don't have a property will be put into this dictionary
// either as primitive types, or as objects of type Newtonsoft.Json.Linq.JObject
// supports nested objects of any Json structure, and will serialize correctly.
[JsonExtensionData]
public Dictionary<string,object> ExtraAttributes get;set;
您可以在https://dotnetfiddle.net/N5SuCY 上查看完整示例。
要将这些属性存储在数据库中,您可以将其与计算的字符串属性相结合:
[JsonIgnore]
public string SerializedExtraAttributes => JsonConvert.SerializeObject(ExtraAttributes);
【讨论】:
【参考方案2】:像这样将 JsonIgnore 属性添加到您的 JSON 属性中:
[JsonIgnore()]
public string JSON get; set;
您可以在反序列化对象后使用它
JObject workerResult = JObject.Parse(json);
// this should contain a list of all the workers
IList<JToken> workers = workerResult["workers"].Children().ToList();
之后,迭代你之前获得的result
对象中的所有worker,并将JSON
属性设置为等效的worker对象
for (int i = 0; i < result.workers.Count; i++)
result.workers[i].JSON = workers[i].ToString();
【讨论】:
JSON 位于列表中向下 2 层的对象中。 @JasonWebber 我已更新我的答案以匹配您的对象以上是关于Newtonsoft 反序列化到对象存储底层 JSON 作为属性的主要内容,如果未能解决你的问题,请参考以下文章
unity C#中使用Newtonsoft.Json进行字符串的序列化和反序列化简易教程
unity C#中使用Newtonsoft.Json进行字符串的序列化和反序列化简易教程
Newtonsoft.Json.JsonSerializationException:'反序列化对象时出现意外标记:使用动态对象注释