2

我确信这个问题已经被问了一遍又一遍,但由于某种原因,我仍然无法让它发挥作用。

我想反序列化一个包含单个成员的 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

3 回答 3

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);
于 2013-07-01T18:00:41.743 回答
2

我认为您使这变得比需要的困难得多。首先,您的示例 json 和您尝试反序列化的类没有字符串数组。它们有一个字符串类型的属性。其次,你为什么要使用这个类DataContractJsonSerializer?你没有做任何你不能从简单调用 json.NET 的通用反序列化方法中得到的东西。我将删除除类定义之外的所有代码,并用这个简单的一行替换它;

 rptaOk[] myInstances = JsonConvert.DeserializeObject<rptaOk>(jsonString);

此外,无论您的 json 的结构是什么,如果您有一个类可以对其进行正确建模,那么该方法将正确地反序列化它。如果你想强制执行某种合同,我建议使用 json.NET 也支持的 json 模式。如果您使用模式,它会强制执行严格的合同,如果您尝试反序列化为对象,则会有一些隐式合同。我不知道会导致它抛出的每个场景,但如果你的 json 离类定义太远,它会。如果您的类具有未出现在 json 中的属性,我相信它们只会使用该类型的默认值进行初始化。

编辑:我刚刚注意到你的 json 实际上是一个对象数组。因此,您只需将该赋值的 lhs 设为数组或rptaOk对象,而不是单例。

于 2013-07-01T16:57:02.480 回答
2

我不知道您是否愿意更改您正在使用的库,但我使用库“Newtonsoft.Json”来反序列化 JSON 对象,它很容易使用

    [HttpPost]
    public void AddSell(string sellList)
    {
        var sellList = JsonConvert.DeserializeObject<List<Sell>>(sellListJson);
        BD.SaveSellList(sellList);
    }

如您所见,您可以将整个 json 对象列表反序列化为“Sell”类型的 List<>,这是我创建的对象......当然,您也可以对数组执行此操作。我不知道正确的语法,但您可以稍后将此列表转换为数组

希望这可以帮助

于 2013-07-01T17:04:49.087 回答