0

First.. I'm not interested in JSON.NET or any other parsers. Only DataContractJsonSerializer

I have to work with structures I get and send to REST API and they look like so:

{           "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"
            }
        }
    ]

What we can see is something like this:

class SomeData
{
    public List<SomeRecord> Records { get; set; }
}

class SomeRecord
{
    public List<KeyValuePair<string, string>> Attributes { get; set; }
}

How do I attribute my object so serializer can produce structure like this? Or should I create object with properties covering each attribute?

Problem is - this webservice seem to be attributes here and there and I'm not even sure of all possible names. So, List of KVP seems like a good choice, but it doesn't work for me.

1 Answer 1

1

Following should work,

    [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());
        }
Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.