在C#中使用DataContractJsonSerializer反序列化JSON对象

时间:2013-07-01 16:49:02

标签: c# json datacontractjsonserializer

我确定这个问题一再被问到,但由于某种原因,我仍然无法让这个问题起作用。

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

3 个答案:

答案 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”这个类型,我创建了一个对象...当然,你也可以对数组这样做。我不知道这个的正确语法,但您可以将此列表转换为数组

希望这有帮助