为了账号安全,请及时绑定邮箱和手机立即绑定

从 JSON 反序列化属性两次?

从 JSON 反序列化属性两次?

C#
慕哥9229398 2021-10-09 16:27:01
我有一个奇怪的问题:我有一个包含子类 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;}}这在运行时不起作用,因为检测到对同一属性的引用。核选项:只需在控制器中反序列化字符串两次,但这感觉是错误的。
查看完整描述

2 回答

?
守着星空守着你

TA贡献1799条经验 获得超8个赞

一种选择是在类中序列化它


[DataContact]

public class ADesired

{

    [DataMember]

    public B Inner {get; set;}

    public string InnerAsJsonString => Newtonsoft.Json.JsonConvert.SerializeObject(Inner);

}


查看完整回答
反对 回复 2021-10-09
?
holdtom

TA贡献1805条经验 获得超10个赞

如果你不关心性能,你可以使用 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 被保存为 json InnerJson,可以是什么,反序列化为Inner,当序列化回来时,任何内容Inner都会被序列化。


查看完整回答
反对 回复 2021-10-09
  • 2 回答
  • 0 关注
  • 264 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信