如何修改List<;词典<;字符串,对象>>;

本文关键字:lt gt 词典 对象 字符串 修改 List 何修改 | 更新日期: 2023-09-27 18:20:41

在我的项目中,web浏览器将一个json对象发送回服务器端(服务器端我使用Asp.net mvc和c#)。json对象如下:

[{
  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;
}

如何修改List<;词典<;字符串,对象>>;

创建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";

不要依赖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";