两次从JSON反序列化属性?

时间:2018-07-16 10:44:07

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

我有一个奇怪的问题:

我有一个包含子类B的类A。类A相当复杂并且经常更改。我只需要将类A的一小部分属性和类B的完整json表示形式传递给其他服务。

这看起来像这样

[DataContact]
public class A 
{
    [DataMember]
    public B Inner {get; set;}
}

[DataContact]
public class B 
{
    [DataMember]
    public int SomeThing {get; set;}
}

我想实现的是:

[DataContact]
public class ADesired
{
    [DataMember]
    public B Inner {get; set;}

    [DataMember]
    public string InnerAsJsonString {get; set;}
}

我尝试了最明显的想法(例如,一个Jsonproperty引用了相同的名称,但NewtonSoft.Json拒绝这样做)

到目前为止,我已经尝试过:

  1. JsonConverter,根本不起作用。

  2. JsonProperties:

    [DataContact]
    public class ADesired
    {
        [JsonProperty("Source")]
        public B Inner {get; set;}
    
        [JsonProperty("Source")]
        public string InnerAsJsonString {get; set;}
    }
    

    这在运行时不起作用,因为检测到对同一属性的引用。

  3. 核选项:只需在控制器中将字符串反序列化两次,但这感觉是错误的。

2 个答案:

答案 0 :(得分:2)

一种选择是将其序列化在类中

[DataContact]
public class ADesired
{
    [DataMember]
    public B Inner {get; set;}
    public string InnerAsJsonString => Newtonsoft.Json.JsonConvert.SerializeObject(Inner);
}

答案 1 :(得分:1)

如果您不关心性能,可以将JObject用作Json-Property类型。

using Newtonsoft.Json;
using Newtonsoft.Json.Linq;

[DatanContract]
public class ADesired
{
    [JsonIgnore]
    public B Inner { get; set; }

    [JsonIgnore]
    public string InnerJson { get; set; }

    [DataMember]
    [JsonProperty(nameof(Inner))
    public JObject JInner
    {
        get => JObject.FromObject(Inner);
        set { Inner = value.ToObject<B>(); InnerJson = value.ToString(); }
    }
}

这样,在反序列化时,实际的json将另存为InnerJson,并且可以将其存储在Inner中,然后进行序列化时,Inner中的任何内容都会被序列化。