Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用不同类型反序列化JSON以进行序列化/反序列化_C#_Json_Datacontractjsonserializer - Fatal编程技术网

C# 使用不同类型反序列化JSON以进行序列化/反序列化

C# 使用不同类型反序列化JSON以进行序列化/反序列化,c#,json,datacontractjsonserializer,C#,Json,Datacontractjsonserializer,我有一门课: [DataContract] public class A { [DataMember] public B ArbitraryProperty { get; set;} } 序列化时,“ArbitraryProperty”需要采用类“B”的形式: 以下是JSON输出: { "ArbitraryProperty": { "ValueA": "I'm a value.", "ValueB": "I'm a value too!" } } 但是,当我从服务器返

我有一门课:

[DataContract]
public class A
{
    [DataMember]
    public B ArbitraryProperty { get; set;}
}
序列化时,“ArbitraryProperty”需要采用类“B”的形式:

以下是JSON输出:

{
    "ArbitraryProperty": { "ValueA": "I'm a value.", "ValueB": "I'm a value too!" }
}
但是,当我从服务器返回同一个对象时,该属性返回为一个简单字符串,如下所示:

{
    "ArbitraryProperty": "I'm not a B, muahahaha!!!"
}
要让DataContractJsonSerializer知道应该将值反序列化为字符串而不是“B”,必须有一个技巧

是否有特殊的方式来设置“a”类/


有什么建议吗?

我认为这不是正确的方法-我认为可读性和可用性的正确答案是正确地键入请求和响应类。但是…我唯一能想到的是将属性设置为
对象,而不是强键入它。您只需要确保在为其赋值时,指定了正确的类型

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=“{'ArbitraryProperty':'This is some string'}”;
a=JsonConvert.DeserializeObject(json);

这段代码可以从JSON.NET进行简单的序列化/反序列化,但我不知道您使用的WebAPI或任何技术是否会喜欢它。

我觉得您有两个类,一个类具有
B
属性,另一个类具有
字符串
属性。您的输出和返回的内容是两个完全不相关的数据结构。@JoeEnos因此出现了问题:)我真的不想为我的请求和响应类型创建不同的类……我想它看起来会像这样。我想我会接受你的建议,做正确的事情,只是创建不同的类型。谢谢
json = "{'ArbitraryProperty':'This is some string'}";
a = JsonConvert.DeserializeObject<A>(json);