tôi đã có mảnh sau JSON:Deserialization vấn đề với DataContractJsonSerializer
[{
"name": "numToRetrieve",
"value": "3",
"label": "Number of items to retrieve:",
"items": {
"1": "1",
"3": "3",
"5": "5"
},
"rules": {
"range": "1-2"
}
},
{
"name": "showFoo",
"value": "on",
"label": "Show foo?"
},
{
"name": "title",
"value": "Foo",
"label": "Foo:"
}]
Tất cả trong một phiên bản dòng (thích hợp cho một chuỗi chữ):
[{\"name\":\"numToRetrieve\",\"value\":\"3\",\"label\":\"Number of items to retrieve:\",\"items\":{\"1\":\"1\",\"3\":\"3\",\"5\":\"5\"},\"rules\":{\"range\":\"1-2\"}},{\"name\":\"showFoo\",\"value\":\"on\",\"label\":\"Show foo?\"},{\"name\":\"title\",\"value\":\"Foo\",\"label\":\"Foo:\"}]
Trong ví dụ trên, name
, value
và label
là bắt buộc nhưng items
và rules
là tùy chọn.
Đây là lớp tôi đang cố gắng để deserialize thành:
using System.Collections;
using System.Collections.Generic;
using System.Runtime.Serialization;
namespace foofoo
{
[DataContract]
public sealed class FooDef
{
[DataMember(Name = "name", IsRequired = true)]
public string Name { get; set; }
[DataMember(Name = "value", IsRequired = true)]
public string Value { get; set; }
[DataMember(Name = "label", IsRequired = true)]
public string Label { get; set; }
[DataMember(Name = "items", IsRequired = false)]
public Dictionary<string, string> Items { get; set; }
[DataMember(Name = "rules", IsRequired = false)]
public Dictionary<string, string> Rules { get; set; }
}
}
Dưới đây là đoạn code tôi sử dụng để deserialize:
var json = new DataContractJsonSerializer(typeof(List<FooDef>));
var bar = "[{\"name\":\"numToRetrieve\",\"value\":\"3\",\"label\":\"Number of items to retrieve:\",\"items\":{\"1\":\"1\",\"3\":\"3\",\"5\":\"5\"},\"rules\":{\"range\":\"1-2\"}},{\"name\":\"showFoo\",\"value\":\"on\",\"label\":\"Show foo?\"},{\"name\":\"title\",\"value\":\"Foo\",\"label\":\"Foo:\"}]";
var stream = new MemoryStream(Encoding.UTF8.GetBytes(bar));
var foo = json.ReadObject(stream);
stream.Close();
Tất cả mọi thứ đi khá tốt ngoại trừ việc items
và rules
đang trống cho đầu tiên FooDef
vượt qua. Tôi đã thử tất cả mọi thứ dưới ánh nắng mặt trời để thử và nhận được chúng: các lớp tùy chỉnh, NameValueCollection
, KeyValuePair<string, string>
, List
của cả hai loại sau và mọi bộ sưu tập khác dường như áp dụng. [EDIT: Tôi quên thử Hashtable
, mà dường như là một ứng cử viên rõ ràng. Đã không hoạt động.]
Vấn đề, như tôi thấy, là phần quan trọng bên dưới items
và rules
là kết thúc mở. Tức là, không phải lúc nào cũng được gọi là range
hoặc 3
. Lời khuyên hay ý tưởng nào?
Đó là những gì tôi lo ngại. Tôi đã tránh chuyển sang JavaScriptSerializer vì sự phản đối, nhưng tôi vui mừng khi biết rằng nó không được chấp nhận trong 3.5 SP1. Tôi sẽ thử nó bằng cách sử dụng lớp đó. – bbrown
Tôi đã thử nó với JavaScriptSerializer và nó hoạt động hoàn hảo. Tôi đã kết thúc bằng cách sử dụng từ điển nhưng Hashtable cũng làm việc. –
bbrown
+1 cho Json.NET –