2014-09-05 100 views
0

在我的項目中,Web瀏覽器發送一個json對象回服務器端(服務器端我使用Asp.net mvc和c#)。 JSON對象象下面這樣:如何修改List中的值<Dictionary <string,object >>

[{ 
    id : "myid", 
    name : "myname", 
    type : "mytype", 
    items : [{ 
    id: "item_id_1", 
    name : "item_name_2", 
    isInput : true, 
    value : value 
    },{ 
    id : "item_id_2", 
    name : "item_name_2", 
    type : "mytype", 
    items : [...] 
    }] 
},{ 
    id : "myid", 
    name : "myname", 
    type : "mytype", 
    items : [...] 
}] 

在服務器端我的用戶解析JSON字符串像這樣:

JavaScriptSerializer jss = new JavaScriptSerializer(); 
List<Distionary<string,object>> jsonObj = (List<Distionary<string,object>>)jss.Deserialize(jsonString,typeof(List<Distionary<string,object>>)); 

我的問題是,如何修改jsonObj值。例如,我如何修改id爲「item_id_2」的子對象。我嘗試下面的代碼:

KeyValuePair<string,object> itemObject = (KeyValuePair<string,object>)item.FirstOrDefault(d=>d.Key == "item_id_2"); 
itemOject.value = "XXX" 

結果是我真的修改對象itemObject但jsonObj對象沒有變化。 所以我的問題是如何修改List>中的對象。 謝謝。

ps:我也想知道編輯後,如何將對象轉換爲json字符串。 謝謝。

PS:在客戶端,下面的功能構建對象:

function toObj(item){ 
    var obj = item.toObj(); 
    if(item.items){ 
    obj.items = []; 
    for(var i = 0;i<item.items.length;i++){ 
    obj.items.push(toObj(item.items[i])); 
    } 
    } 
    return obj; 
} 
+0

你能說明'item'變量是如何實例化的嗎? – decPL 2014-09-05 09:46:23

回答

0

創建2個自定義對象像:

public class Object1 
    { 
     public string id {get;set;} 
     public string name {get;set;} 
     public string type {get;set;} 
     public List<Object2> items {get;set;} 
    } 

    public class Object2 
    { 
     public string id {get;set;} 
     public string name {get;set;} 
     public string value {get;set;} 
     public bool isInput {get;set;} 
    } 

反序列化JSON:

JavaScriptSerializer jss = new JavaScriptSerializer(); 
    List<Object1> jsonObj = (List<Object1>>)jss.Deserialize(jsonString,typeof(List<Object1>)) 

的LINQ:

var obj= jsonObj.FirstOrDefault(c=>c.id="item_id_2"); 
objt.items[0].value ="change"; 
+0

嗨,侯賽因扎瓦維,其實我不知道Object1的項目中的對象是Object1或Object2 – user2155362 2014-09-06 00:13:58

+0

Object2因爲每個Object1都有一個Object2類型的列表 – 2014-09-07 18:23:24

0

不要依靠List<Dictionary<String,Object>>,這是一個地獄來維護,這在你的問題中很明顯。定義一個類來保存你的數據,例如:

public class SomeJsonObject 
{ 
    public String id { get; set; } 
    public String name { get; set; } 
    public String type { get; set; } 
    public bool isInput { get; set; } 
    public String value { get; set; } 
    public List<SomeJsonObject> items { get; set; } 

    public IEnumerable<SomeJsonObject> AllWithChildren 
    { 
     get 
     { 
      yield return this; 
      if (this.items == null) yield break; 
      foreach (var descendant in 
       this.items.SelectMany(child => child.AllWithChildren)) 
      { 
       yield return descendant; 
      } 
     } 
    } 
} 

AllWithChildren助手屬性,可以讓你列出所有項目作爲一個平面列表。然後你可以做這樣的事情:

var jsonObj = jss.Deserialize(jsonString, typeof(List<SomeJsonObject>)) 
       as (List<SomeJsonObject>); 
var item2 = jsonObj.SelectMany(x => x.AllWithChildren) 
        .FirstOrDefault(x => x.id == "item_id_2"); 
if (item2 != null) item2.value = "XXX"; 
+0

嗨decPL,你知道如何將對象轉換爲json字符串後編輯? – user2155362 2014-09-06 00:25:17

+0

@ user215536​​2 1.將'[ScriptIgnore]'屬性應用於'AllWithChildren'屬性以允許該類被序列化回2. [var resultJson = jss.Serialize(jsonObj);' – decPL 2014-09-08 07:32:06

相關問題