【问题标题】:Deserializing JSON with different types for serialization/deserialization使用不同类型反序列化 JSON 以进行序列化/反序列化
【发布时间】:2017-08-10 06:29:10
【问题描述】:

我有一堂课:

[DataContract]
public class A
{
    [DataMember]
    public B ArbitraryProperty { get; set;}
}

序列化时,“ArbitraryProperty”需要为“B”类的形式:

[DataContract]
public class B
{
    [DataMember]
    public string ValueA { get; set; }
    [DataMember]
    public string ValueB { get; set; }
}

这是 JSON 输出:

{
    "ArbitraryProperty": { "ValueA": "I'm a value.", "ValueB": "I'm a value too!" }
}

但是,当我从服务器返回相同的对象时,该属性会以一个简单的字符串形式返回,如下所示:

{
    "ArbitraryProperty": "I'm not a B, muahahaha!!!"
}

必须有一个技巧让 DataContractJsonSerializer 知道它应该将值反序列化为字符串而不是“B”。

有没有一种特殊的方法来设置“A”类? :/

有什么建议吗?

【问题讨论】:

  • 听起来你有两个类,一个有B 属性,一个有string 属性。你的输出和你说的回来是两个完全不相关的数据结构。
  • @JoeEnos 因此问题:) 我真的不想为我的请求和响应类型创建不同的类...

标签: c# json datacontractjsonserializer


【解决方案1】:

我认为这不是正确的方法 - 我认为可读性和可用性的正确答案是正确键入请求和响应类。但是......我唯一能想到的就是将属性设为object,而不是强输入它。您只需要确保在为它分配值时分配正确的类型。

public class A
{
    public object ArbitraryProperty { get; set; }
}

它仍然会正确序列化:

var a = new A { ArbitraryProperty = new B { ValueA = "a", ValueB = "b" } };
var json = JsonConvert.SerializeObject(a);
Console.WriteLine(json);

当对象返回时,反序列化会将字符串放入属性中。

json = "{'ArbitraryProperty':'This is some string'}";
a = JsonConvert.DeserializeObject<A>(json);

此代码适用于来自 JSON.NET 的简单序列化/反序列化,但我不知道 WebAPI 或您使用的任何技术是否会喜欢它。

【讨论】:

  • 我认为它会看起来像那样。我想我会听取您的建议,做正确的事,然后创建不同的类型。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-13
相关资源
最近更新 更多