2017-01-02 19 views
0

我使用api工作,它返回數據庫查詢的json格式的結果集。 我有一個等效的對象或「模型」的結果。 將json字符串轉換爲此對象列表的最佳方式是什麼?將json字符串轉換爲C#中現有對象的列表#

當然有很多關於此的線索,但沒有人適合我的需要。

一個我已經找到了解決辦法是這樣的:

var jobj = (JObject)JsonConvert.DeserializeObject(json); 
var items = jobj.Children() 
    .Cast<JProperty>() 
    .Select(j => new 
    { 
     ID = j.Name, 
     Topic = (string)j.Value["Topic_ID"], 
     Moved = (string)j.Value["Moved_ID"], 
     Subject = (string)j.Value["subject"], 
    }) 
    .ToList(); 

這似乎很接近我所需要的。我需要能夠將鍵/值映射到已經存在的適當對象屬性。所以也許你只需要改變一些東西來使它適用於我的對象? PS:我正在使用Newtonsoft。任何針對.NET或Newtonsoft的解決方案或者如果需要任何其他庫都會很棒!

+0

如果json屬性和最終對象屬性不完全匹配,我會創建一個DTO(DataTransferObject)來匹配json,從json加載到DTO中,然後將DTO轉換爲最終對象。一個額外的步驟,但有點清潔(像AutoMapper這樣的工具也可以在這裏幫助一點) – jleach

+0

你可能想說爲什麼沒有現有的線程符合你的問題。閱讀你的問題我猜可能是因爲你的模型對象成員名稱與JSON對象的名稱不匹配,但不清楚是這種情況。 – sebf

+1

[將JSON數據反序列化爲使用JSON.NET的C#]可能的重複(http://stackoverflow.com/questions/2546138/deserializing-json-data-to-c-sharp-using-json-net) –

回答

0

好了,你有這樣的事情:

public class MyObject 
{ 
    public int ID {get; set;} 
    public string Topic {get; set;} 
    public string Subject {get; set;} 
} 

而且要實例從您的JSON來的屬性MyObjects的陣列?

在這種情況下,你只是一個回合 - 你目前正在創建一個動態對象,具有與MyObject相同的屬性,對吧?因此,所有你需要做的就是創建一個實際的MyObject來代替:

.Select(j => new **MyObject()** 
{ 
    ID = j.Name, 
    Topic = (string)j.Value["Topic_ID"], 
    Moved = (string)j.Value["Moved_ID"], 
    Subject = (string)j.Value["subject"] 
}) 

需要注意的是,如果你的JSON屬性名稱完全符合您的C#的人(包括大小寫),你可以做到這一點作爲一個班輪與NewtonSoft:http://www.newtonsoft.com/json/help/html/SerializingJSON.htm 。但要使用該方法,您必須有一箇中間C#類來匹配您的JSON,然後將這些類自動映射(或手動轉換)到MyObjects。或者你必須確保你的json和c#屬性完全匹配。但是你已經非常接近更快的速度(雖然有些人會認爲不那麼優雅)解決方案。

+0

感謝您的回覆。 我得到一個System.InvalidCastException var jobj =(JObject)JsonConvert.DeserializeObject(json); (使用Newtonsoft.Json.Linq) 當我將JObject更改爲Brand時,它抱怨未定義的Children()方法。也許我應該只是調整數據庫中的列名... – Cutaraca

+0

我找到了一個乾淨簡單的方法:這個提問者與你具有相同的情況,我認爲,第一個答案看起來不錯:http://stackoverflow.com/questions/2546138/deserializing-json-data-to-c-sharp-using-json-net基本上,你使用通用的JsonConvert.DeserializeObject (字符串json)進行反序列化,並用你的名字來修飾你的類的屬性的JSON屬性,根據提問者的代碼 - [JsonProperty(PropertyName =「username」)] –

0

我最近一直在消耗從數據的WebAPI和我一直在使用下面的代碼,以JSON對象轉換爲對象一起工作:

using (var client = new HttpClient()) 
{ 
    var response = client.GetAsync(apiUri).Result; 

    // For single objects. 
    MyObject data = response.Content.ReadAsAsync<MyObject>().Result; 

    // For an array of objects 
    IEnumerable<MyObject> data = response.Content.ReadAsAsync<IEnumerable<MyObject>>().Result; 
} 

希望這有助於。

0

爲什麼不直接將json反序列化爲對象類型?你可以這樣做...

var obj = (YourType)JsonConvert.DeserializeObject(
        json, 
        typeof(YourType), 
        new JsonSerializerSettings() 
        { 
         TypeNameHandling = TypeNameHandling.Auto, 
         MissingMemberHandling=MissingMemberHandling.Ignore 
        }); 

或者我錯過了什麼問題?