|
using System.Dynamic;
using System.Linq;
using Newtonsoft.Json.Linq;
namespace Raven.Database.Linq
{
public class DynamicJsonObject : DynamicObject
{
private readonly JObject obj;
public DynamicJsonObject(JObject obj)
{
this.obj = obj;
}
public override bool TryGetMember(GetMemberBinder binder, out object result)
{
result = GetValue(binder.Name);
return true;
}
public override bool TryGetIndex(GetIndexBinder binder, object[] indexes, out object result)
{
if (indexes.Length != 1 || indexes[0] is string == false)
{
result = null;
return false;
}
result = GetValue((string)indexes[0]);
return true;
}
private static object TransformToValue(JToken jToken)
{
switch (jToken.Type)
{
case JsonTokenType.Object:
return new DynamicJsonObject((JObject) jToken);
case JsonTokenType.Array:
return jToken.Select(TransformToValue).ToArray();
default:
return jToken.Value<object>();
}
}
public object GetValue(string name)
{
if (name == "__document_id")
{
return GetDocumentId();
}
JToken value;
if (obj.TryGetValue(name, out value))
{
return TransformToValue(value);
}
return null;
}
private object GetDocumentId()
{
var metadata = obj["@metadata"];
if (metadata != null)
{
var id = metadata["@id"];
if (id != null)
{
return id.Value<object>();
}
}
return null;
}
}
}
|
By viewing downloads associated with this article you agree to the Terms of Service and the article's licence.
If a file you wish to view isn't highlighted, and is a text file (not binary), please
let us know and we'll add colourisation support for it.
I've been a software developer since 1996 and have enjoyed C# since 2003. I have a Bachelor's degree in Computer Science and for some reason, a Master's degree in Business Administration. I currently do software development contracting/consulting.
This member has not yet provided a Biography. Assume it's interesting and varied, and probably something to do with programming.