JSON使用.NET DataContractJsonSerializer串行器进行字典序列化/反序列化
问题描述:
首先..我对JSON.NET或任何其他解析器不感兴趣。只有DataContractJsonSerializerJSON使用.NET DataContractJsonSerializer串行器进行字典序列化/反序列化
我有一个结构,我去工作,发送到REST API,他们看起来像这样:
{ "records": [
{
"attributes": {
"OBJECTID": 1,
"Address": "380 New York St.",
"City": "Redlands",
"Region": "CA",
"Postal": "92373"
}
},
{
"attributes": {
"OBJECTID": 2,
"Address": "1 World Way",
"City": "Los Angeles",
"Region": "CA",
"Postal": "90045"
}
}
]
我们所看到的是这样的:
class SomeData
{
public List<SomeRecord> Records { get; set; }
}
class SomeRecord
{
public List<KeyValuePair<string, string>> Attributes { get; set; }
}
我如何归因于我的对象,所以串行器可以产生这样的结构?或者我应该创建包含每个属性的属性的对象?
问题是 - 此webservice似乎是属性在这里和那里,我甚至不知道所有可能的名称。所以,KVP名单似乎是一个不错的选择,但它对我无效。
答
以下应该工作,
[DataContract]
[KnownType(typeof(Record))]
public class RecordList
{
public RecordList()
{
Records = new List<Record>();
}
[DataMember]
public List<Record> Records { get; set; }
}
public class Record
{
public Record()
{
Attributes = new AttributeList();
}
[DataMember]
public AttributeList Attributes { get; set; }
}
[Serializable]
public class AttributeList : DynamicObject, ISerializable
{
private readonly Dictionary<string, object> attributes = new Dictionary<string, object>();
public override bool TrySetMember(SetMemberBinder binder, object value)
{
attributes[binder.Name] = value;
return true;
}
public void GetObjectData(SerializationInfo info, StreamingContext context)
{
foreach (var kvp in attributes)
{
info.AddValue(kvp.Key, kvp.Value);
}
}
}
[Test]
public void TestSerialize()
{
var holder = new RecordList();
dynamic record = new Record();
record.Attributes.OBJECTID = 1;
record.Attributes.Address = "380 New York St.";
record.Attributes.City = "Redlands";
record.Attributes.Address = "Region";
record.Attributes.Region = "CA";
record.Attributes.Postal = "92373";
holder.Records.Add(record);
var stream1 = new MemoryStream();
var serializer = new DataContractJsonSerializer(typeof(RecordList));
serializer.WriteObject(stream1, holder);
stream1.Position = 0;
StreamReader sr = new StreamReader(stream1);
Console.Write("JSON form of holder object: ");
Console.WriteLine(sr.ReadToEnd());
}