JSON使用.NET DataContractJsonSerializer序列化程序使用Dictionary进行序列化/反序列化

时间:2014-10-21 22:11:01

标签: c# json parsing datacontractjsonserializer

首先..我对JSON.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; }
}

如何归因于我的对象,以便序列化程序可以生成这样的结构?或者我应该创建具有覆盖每个属性的属性的对象吗?

问题是 - 这个web服务似乎是这里和那里的属性,我甚至不确定所有可能的名称。因此,KVP列表似乎是一个不错的选择,但它对我不起作用。

1 个答案:

答案 0 :(得分:1)

以下应该有效,

    [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());
        }