Newtonsoft反序列化为对象存储基础JSON作为属性

时间:2018-04-08 21:43:46

标签: c# json json.net

我正在使用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);

2 个答案:

答案 0 :(得分:3)

我认为您的意思是要将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);

答案 1 :(得分:1)

将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();