我有一个奇怪的问题:
我有一个包含子类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拒绝这样做)
到目前为止,我已经尝试过:
JsonConverter,根本不起作用。
JsonProperties:
[DataContact]
public class ADesired
{
[JsonProperty("Source")]
public B Inner {get; set;}
[JsonProperty("Source")]
public string InnerAsJsonString {get; set;}
}
这在运行时不起作用,因为检测到对同一属性的引用。
核选项:只需在控制器中将字符串反序列化两次,但这感觉是错误的。
答案 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
中的任何内容都会被序列化。