从 JSON 反序列化属性两次?

我有一个奇怪的问题:


我有一个包含子类 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,根本不起作用。


Json属性:


[DataContact]

public class ADesired

{

    [JsonProperty("Source")]

    public B Inner {get; set;}


    [JsonProperty("Source")]

    public string InnerAsJsonString {get; set;}

}

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


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


慕哥9229398
浏览 265回答 2
2回答

守着星空守着你

一种选择是在类中序列化它[DataContact]public class ADesired{    [DataMember]    public B Inner {get; set;}    public string InnerAsJsonString => Newtonsoft.Json.JsonConvert.SerializeObject(Inner);}

holdtom

如果你不关心性能,你可以使用 JObject 作为 Json-Property 类型。using Newtonsoft.Json;using Newtonsoft.Json.Linq;[DatanContract]public class ADesired{&nbsp; &nbsp; [JsonIgnore]&nbsp; &nbsp; public B Inner { get; set; }&nbsp; &nbsp; [JsonIgnore]&nbsp; &nbsp; public string InnerJson { get; set; }&nbsp; &nbsp; [DataMember]&nbsp; &nbsp; [JsonProperty(nameof(Inner))&nbsp; &nbsp; public JObject JInner&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; get => JObject.FromObject(Inner);&nbsp; &nbsp; &nbsp; &nbsp; set { Inner = value.ToObject<B>(); InnerJson = value.ToString(); }&nbsp; &nbsp; }}这样在反序列化时,实际的 json 被保存为 json InnerJson,可以是什么,反序列化为Inner,当序列化回来时,任何内容Inner都会被序列化。
打开App,查看更多内容
随时随地看视频慕课网APP