我相信这个问题已经被问了一遍又一遍,但出于某种原因,我仍然无法让它发挥作用。
我想反序列化一个包含单个成员的JSON对象;字符串数组:
[{"idTercero":"cod_Tercero"}]
这是我尝试反序列化的类:
[DataContract]
public class rptaOk
{
[DataMember]
public string idTercero { get; set; }
public rptaOk() { }
public rptaOk(string idTercero)
{
this.idTercero = idTercero;
}
}
这是我尝试反序列化的方法:
public T Deserialise<T>(string json)
{
DataContractJsonSerializer deserializer = new DataContractJsonSerializer(typeof(T));
using (MemoryStream stream = new MemoryStream(Encoding.Unicode.GetBytes(json)))
{
T result = (T)deserializer.ReadObject(stream);
return result;
}
}
所以我试着填充这个对象:
rptaOk deserializedRpta = deserializarOk(rpta);
但由于某种原因,这个返回“”
MessageBox.Show(deserializedRpta.idTercero);
4条答案
按热度按时间kiayqfof1#
在.net framework之外没有任何依赖项的情况下,您可以这样做。
vpfxa7rd2#
我不知道你是否愿意改变你正在使用的库,但我使用库“Newtonsoft.JSON”来反序列化JSON对象,它非常容易使用
正如你所看到的,你可以将整个json对象列表反序列化为类型为“Sell”的List<>,这是我创建的一个对象。当然,你也可以对数组这样做。我不知道正确的语法,但是你可以在后面把这个列表转换成数组
希望这对你有帮助
ckx4rj1h3#
我觉得你把事情搞得太复杂了。首先,您的示例json和您试图反序列化的类没有字符串数组。它们只有一个字符串类型的属性。第二,为什么要使用
DataContractJsonSerializer
类?你没有做任何你不能从一个简单的调用json.NET的通用反序列化方法。我会删除除类定义之外的所有代码,并将其替换为这个简单的一行代码;此外,无论json的结构是什么,如果你有一个类来正确地建模它,那么这个方法就会正确地反序列化它。如果你想强制执行某种契约,我建议你使用json.NET也支持的json模式。如果你使用一个模式,它会强制执行一个严格的契约,如果你试图反序列化到一个对象中,就会有一些隐式的契约。我不知道每一个会导致它抛出的场景,但如果你的json离类定义太远,它就会抛出。如果你的类的属性没有出现在json中,我相信它们会被初始化为该类型的默认值。
编辑:我刚刚注意到你的JSON实际上是一个对象数组。所以你只需要把这个赋值的lhs变成一个数组或者
rptaOk
对象,而不是一个单例。zsbz8rwp4#
我意识到这个答案已经很晚了,但这里有一个完整的单一类型
DataContractJsonSerializer
,我称之为JsonContract<T>
序列化
反序列化
JsonContract
测试结果
注意事项
.NET Standard 2.0
我只是做了这个测试的目的,你可以用它来做任何你想要的。
如果你认为这是一个更快的选择,你应该测试数据,因为根据类型
Newtonsoft.Json
的复杂性可能会更快.