簡體   English   中英

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

[英]Deserialization of JSON object by using DataContractJsonSerializer in C#

我確定這個問題一再被問到,但由於某種原因,我仍然無法讓這個問題起作用。

我想反序列化包含單個成員的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);

沒有.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);

我認為你使這比現在要困難得多。 首先,您的示例json和您嘗試反序列化的類沒有字符串數組。 它們具有string類型的單個屬性。 其次,為什么要使用這個類DataContractJsonSerializer 你沒有做任何事情,你不能從簡單的調用json.NET的通用反序列化方法。 我將刪除除類定義之外的所有代碼,並將其替換為這個簡單的單行程序;

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

此外,無論你的json的結構是什么,如果你有一個類來正確地建模它,那么該方法將正確地反序列化它。 如果你想強制執行某種合同我建議使用json.NET也支持的json模式。 如果您使用模式,它會強制執行剛性合約,如果您嘗試反序列化為對象,則存在隱式契約。 我不知道會導致它拋出的每個場景,但是如果你的json離類定義太遠,它會。 如果您的類具有未出現在json中的屬性,我相信它們將使用該類型的默認值進行初始化。

編輯:我剛剛注意到你的json實際上是一個對象數組。 因此,您只需要將該賦值的lhs rptaOk數組或rptaOk對象,而不是單個。

我不知道你是否願意改變你正在使用的庫,但我使用庫“Newtonsoft.Json”來反序列化JSON對象,它很容易使用

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

正如您所看到的,您可以將整個json對象列表反序列化為類型為“Sell”的List <>,這是我創建的對象......當然,您也可以對數組執行此操作。 我不知道這個的正確語法,但您可以將此列表轉換為數組

希望這可以幫助

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM