我确定这个问题一再被问到,但由于某种原因,我仍然无法让这个问题起作用。
我想反序列化包含单个成员的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);
答案 0 :(得分:4)
在.net框架之外没有任何依赖关系,你可以这样做
[DataContract(Name="rptaOk")]
public class RptaOk
{
[DataMember(Name="idTercero")]
public string IdTercero { get; set; }
}
[CollectionDataContract(Name="rptaOkList")]
public class RptaOkList : List<RptaOk>{}
var stream = new StreamReader(yourJsonObjectInStreamFormat);
var serializer = new DataContractSerializer(typeof(RptaOkList));
var result = (RptOkList) serializer.ReadObject(stream);
答案 1 :(得分:2)
我认为你让它变得比它需要的困难得多。首先,您的示例json和您尝试反序列化的类没有字符串数组。它们具有string类型的单个属性。其次,你为什么要使用这个课程DataContractJsonSerializer
?你没有做任何事情,你不能从简单的调用json.NET的通用反序列化方法。除了类定义之外,我会删除所有代码,并用这个简单的单行代码替换它;
rptaOk[] myInstances = JsonConvert.DeserializeObject<rptaOk>(jsonString);
此外,无论你的json的结构是什么,如果你有一个类来正确地建模它,那么该方法将正确地反序列化它。如果你想强制执行某种合同我建议使用json.NET也支持的json模式。如果您使用模式,它会强制执行刚性合约,如果您尝试反序列化为对象,则存在隐式契约。我不知道会导致它抛出的每个场景,但是如果你的json离类定义太远,它会。如果您的类具有未出现在json中的属性,我相信它们将使用该类型的默认值进行初始化。
编辑:我刚注意到你的json实际上是一个对象数组。所以你只需要让该赋值的lhs成为数组或rptaOk
个对象,而不是单个。
答案 2 :(得分:2)
我不知道你是否愿意改变你正在使用的库,但我使用库“Newtonsoft.Json”来反序列化JSON对象,它很容易使用
[HttpPost]
public void AddSell(string sellList)
{
var sellList = JsonConvert.DeserializeObject<List<Sell>>(sellListJson);
BD.SaveSellList(sellList);
}
如您所见,您可以将整个json对象列表反序列化为List&lt;&gt;对于“Sell”这个类型,我创建了一个对象...当然,你也可以对数组这样做。我不知道这个的正确语法,但您可以将此列表转换为数组
希望这有帮助