public void SerializeDynamicObject()
{
TestDynamicObject dynamicObject = new TestDynamicObject();
dynamicObject.Explicit = true;
dynamic d = dynamicObject;
d.Int = 1;
d.Decimal = 99.9d;
d.ChildObject = new DynamicChildObject();
Dictionary <string, object> values = new Dictionary <string, object>();
IContractResolver c = DefaultContractResolver.Instance;
JsonDynamicContract dynamicContract = (JsonDynamicContract)c.ResolveContract(
dynamicObject.GetType()
);
foreach (string memberName in dynamicObject.GetDynamicMemberNames())
{
object value;
dynamicContract.TryGetMember(dynamicObject, memberName, out value);
values.Add(memberName, value);
}
Assert.AreEqual(d.Int, values["Int"]);
Assert.AreEqual(d.Decimal, values["Decimal"]);
Assert.AreEqual(d.ChildObject, values["ChildObject"]);
string json = JsonConvert.SerializeObject(dynamicObject, Formatting.Indented);
StringAssert.AreEqual(
@"{
""Explicit"": true,
""Decimal"": 99.9,
""Int"": 1,
""ChildObject"": {
""Text"": null,
""Integer"": 0
}
}",
json
);
TestDynamicObject newDynamicObject = JsonConvert.DeserializeObject <TestDynamicObject>(
json
);
Assert.AreEqual(true, newDynamicObject.Explicit);
d = newDynamicObject;
Assert.AreEqual(99.9, d.Decimal);
Assert.AreEqual(1, d.Int);
Assert.AreEqual(dynamicObject.ChildObject.Integer, d.ChildObject.Integer);
Assert.AreEqual(dynamicObject.ChildObject.Text, d.ChildObject.Text);
}