在我的项目中,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&#34; item_id_2&#34;修改子对象。我尝试下面的代码:
KeyValuePair<string,object> itemObject = (KeyValuePair<string,object>)item.FirstOrDefault(d=>d.Key == "item_id_2");
itemOject.value = "XXX"
结果是我真的修改了对象itemObject,但jsonObj中的对象没有变化。 所以我的问题是如何修改List&gt;中的对象。 谢谢。
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 :(得分: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";
答案 1 :(得分: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";