2011-08-12 32 views
11

Tôi muốn tuần tự hóa đối tượng động vào JSON. Tôi đã cố gắng sử dụng ExpandoObject, nhưng kết quả không phải là những gì tôi cần:Làm thế nào tôi có thể tuần tự hóa đối tượng động vào JSON trong hành động C# MVC Controller?

public JsonResult Edit() 
{ 
    dynamic o = new ExpandoObject(); 
    ((IDictionary<string,Object>)o)["abc"] = "ABC"; //or o.abc = "ABC"; 
    return Json(o); 
} 

Tôi muốn JSON để trông giống như: { "abc": "ABC"} nhưng thay vào đó nó trông giống như [{ "Key": "abc "," Giá trị ":" ABC "}] Rõ ràng ExpandoObject sẽ không làm, nhưng tôi có thể kế thừa từ DynamicObject và bằng cách nào đó ghi đè lên các phương thức của nó để đạt được định dạng JSON tôi muốn không?

+1

trả lời là để san bằng theo: http://stackoverflow.com/questions/5156664/how-to-flatten-an-expandoobject-returned-via-jsonresult-in-asp-net-mvc – Joe

+0

@ JoeTuskan btw bỏ phiếu có giá trị của nó để đóng những thứ như thế này –

Trả lời

1

Điều này sẽ trả lại những gì bạn muốn.

public JsonResult Edit() 
{ 
    return Json(new {abc = "ABC"}); 
} 
+3

Đây là một lớp học có tài sản abc. Tôi muốn lớp có các thuộc tính được thêm vào lúc chạy. – panpawel

3

này có thể không hữu ích cho bạn, nhưng tôi có một yêu cầu tương tự, nhưng sử dụng một SerializableDynamicObject

tôi đã thay đổi tên của từ điển để "Fields" và sau đó này serializes với Json.Net để sản xuất json trông giống như: tính

{"Fields":{"Property1":"Value1", "Property2":"Value2" etc. 

nơi Property1 và Property2 được thêm động - tức là từ điển phím

sẽ perfec t nếu tôi có thể loại bỏ các thuộc tính "Trường" bổ sung đóng gói phần còn lại, nhưng tôi đã làm việc xung quanh giới hạn đó.

+1

Bạn có thể chuyển điều này sang http://stackoverflow.com/questions/5156664/how-to-flatten-an-expandoobject-returned-via-jsonresult-in-asp-net-mvc và VTC này không? Tôi thậm chí sẽ ném +1 vào thỏa thuận: D –

+1

đã hoàn tất - đã chuyển và VTC – BonyT

0

Bạn luôn có thể tuần tự hóa một HashTable, nó không hoạt động nhưng nó hỗ trợ các cặp giá trị khóa đối tượng.

0

Điều này làm việc cho tôi một cách hoàn hảo. Bạn phải sử dụng Json.NET.

[HttpGet] 
    public string GetJson() 
    { 
     List<Dictionary<string, string>> list = new List<Dictionary<string, string>>(); 

     List<DataEntry> properties = new List<DataEntry>(); 

     for (int i = 0; i < 10; i++) 
     { 
      properties.Add(new DataEntry { Column = "column" + i.ToString(), Value = "value" + i.ToString() }); 
     } 

     list.Add(properties.ToDictionary(x => x.Column, y => y.Value)); 
     string test = JsonConvert.SerializeObject(list); 

     return test; 
    } 
3

Tôi đã gặp sự cố tương tự này và đã kết thúc khắc phục sự cố bằng cách sử dụng trình nối tiếp JSON.net (Newtonsoft.Json) thay vì sử dụng kết quả JsonContent. Sau đó nó tuần tự hóa các đối tượng động của tôi với các thuộc tính bình thường so với danh sách kỳ lạ "key" "value".

//In my usage I had a list of dynamic objects 
var output = new List<dynamic>(); 

//Change this 
return JsonContent(new {Error = errorMessage, Results = output}); 

//to this 
return Content(JsonConvert.SerializeObject(new {Error = errorMessage, Results = output})); 
+0

Vui lòng xem xét sao chép câu trả lời của bạn vào http://stackoverflow.com/questions/5156664/how-to-flatten-an-expandoobject-returned -via-jsonresult-in-asp-net-mvc – ProfNimrod

Các vấn đề liên quan