###Example
Example
void Main()
{
var json = @"{ ""$t"": ""MyType"", ""User "": ""John"", ""Nested"": { ""$t"": ""OtherType"", "" ZIP"": 12345 }, ""Numbers"": [1, 2, 3 ] }";
var jToken = JToken.Parse(json);
jToken.ToString().Dump("Original");
var propertyNameTrimmer = new PropertyNameTrimmer();
var typeResolver = new TypeResolver("$t", shortName => shortName + "_resolved");
var trimmed = propertyNameTrimmer.Visit(jToken);
trimmed.ToString().Dump(nameof(PropertyNameTrimmer));
var typeResolved = typeResolver.Visit(trimmed);
typeResolved.ToString().Dump(nameof(TypeResolver));
}
###Example
void Main()
{
var json = @"{ ""$t"": ""MyType"", ""User "": ""John"", ""Nested"": { ""$t"": ""OtherType"", "" ZIP"": 12345 }, ""Numbers"": [1, 2, 3 ] }";
var jToken = JToken.Parse(json);
jToken.ToString().Dump("Original");
var propertyNameTrimmer = new PropertyNameTrimmer();
var typeResolver = new TypeResolver("$t", shortName => shortName + "_resolved");
var trimmed = propertyNameTrimmer.Visit(jToken);
trimmed.ToString().Dump(nameof(PropertyNameTrimmer));
var typeResolved = typeResolver.Visit(trimmed);
typeResolved.ToString().Dump(nameof(TypeResolver));
}
Example
void Main()
{
var json = @"{ ""$t"": ""MyType"", ""User "": ""John"", ""Nested"": { ""$t"": ""OtherType"", "" ZIP"": 12345 }, ""Numbers"": [1, 2, 3 ] }";
var jToken = JToken.Parse(json);
jToken.ToString().Dump("Original");
var propertyNameTrimmer = new PropertyNameTrimmer();
var typeResolver = new TypeResolver("$t", shortName => shortName + "_resolved");
var trimmed = propertyNameTrimmer.Visit(jToken);
trimmed.ToString().Dump(nameof(PropertyNameTrimmer));
var typeResolved = typeResolver.Visit(trimmed);
typeResolved.ToString().Dump(nameof(TypeResolver));
}
- 44.6k
- 9
- 84
- 190
public delegate JToken VisitJsonCallback(JToken token);
public class JsonVisitor
{
public static JToken Visit(JToken jTokentoken, params JsonVisitor[] visitors)
{
return visitors.Aggregate(token, (current, visitor) => visitor.Visit(current));
}
public static VisitJsonCallback Create(params JsonVisitor[] visitors) => jToken => Visit(jToken, visitors);
public JToken Visit(JToken token)
{
return
token is JValue
? jTokentoken
: VisitInternal(jTokentoken, CreateJContainer(jTokentoken.Type));
}
private JToken VisitInternal(JToken jTokentoken, JContainer result)
{
if (jTokentoken is JValue)
{
return jToken;token;
}
foreach (var element in jTokentoken)
{
switch (element)
{
case JProperty jPropertyproperty:
var visitedProperty = VisitProperty(jProperty.Name, Visit(jProperty.Value)property);
result.Add(visitedProperty);
break;
default:
result.Add(Visit(element));
break;
}
}
return result;
}
protected virtual JProperty VisitProperty(stringJProperty name,property)
JToken value) => {
return new JProperty(nameproperty.Name, valueVisit(property.Value));
}
private static JContainer CreateJContainer(JTokenType typetokenType)
{
switch (typetokenType)
{
case JTokenType.Object: return new JObject();
case JTokenType.Array: return new JArray();
default: throw new ArgumentOutOfRangeException($"Invalid type: {typetokenType}");
}
}
}
public class PropertyNameTrimmer : JsonVisitor
{
protected override JProperty VisitProperty(string name, JTokenJProperty valueproperty)
{
return new JProperty(nameproperty.Name.Trim(), valueVisit(property.Value));
}
}
public class TypeResolver : JsonVisitor
{
private readonly string _typePropertyName;
private readonly Func<string, string> _resolveType;
public TypeResolver(string typePropertyName, Func<string, string> resolveType)
{
_typePropertyName = typePropertyName;
_resolveType = resolveType;
}
protected override JProperty VisitProperty(string name, JTokenJProperty valueproperty)
{
return
nameproperty.Name == _typePropertyName
? new JProperty("$type", _resolveType(valueproperty.Value.Value<string>()))
: base.VisitProperty(name, valueproperty);
}
}
class JsonVisitor
{
public JToken Visit(JToken jToken)
{
return
jToken is JValue
? jToken
: VisitInternal(jToken, CreateJContainer(jToken.Type));
}
private JToken VisitInternal(JToken jToken, JContainer result)
{
if (jToken is JValue)
{
return jToken;
}
foreach (var element in jToken)
{
switch (element)
{
case JProperty jProperty:
var visitedProperty = VisitProperty(jProperty.Name, Visit(jProperty.Value));
result.Add(visitedProperty);
break;
default:
result.Add(Visit(element));
break;
}
}
return result;
}
protected virtual JProperty VisitProperty(string name, JToken value) => new JProperty(name, value);
private static JContainer CreateJContainer(JTokenType type)
{
switch (type)
{
case JTokenType.Object: return new JObject();
case JTokenType.Array: return new JArray();
default: throw new ArgumentOutOfRangeException($"Invalid type: {type}");
}
}
}
class PropertyNameTrimmer : JsonVisitor
{
protected override JProperty VisitProperty(string name, JToken value)
{
return new JProperty(name.Trim(), value);
}
}
class TypeResolver : JsonVisitor
{
private readonly string _typePropertyName;
private readonly Func<string, string> _resolveType;
public TypeResolver(string typePropertyName, Func<string, string> resolveType)
{
_typePropertyName = typePropertyName;
_resolveType = resolveType;
}
protected override JProperty VisitProperty(string name, JToken value)
{
return
name == _typePropertyName
? new JProperty("$type", _resolveType(value.Value<string>()))
: base.VisitProperty(name, value);
}
}
public delegate JToken VisitJsonCallback(JToken token);
public class JsonVisitor
{
public static JToken Visit(JToken token, params JsonVisitor[] visitors)
{
return visitors.Aggregate(token, (current, visitor) => visitor.Visit(current));
}
public static VisitJsonCallback Create(params JsonVisitor[] visitors) => jToken => Visit(jToken, visitors);
public JToken Visit(JToken token)
{
return
token is JValue
? token
: VisitInternal(token, CreateJContainer(token.Type));
}
private JToken VisitInternal(JToken token, JContainer result)
{
if (token is JValue)
{
return token;
}
foreach (var element in token)
{
switch (element)
{
case JProperty property:
var visitedProperty = VisitProperty(property);
result.Add(visitedProperty);
break;
default:
result.Add(Visit(element));
break;
}
}
return result;
}
protected virtual JProperty VisitProperty(JProperty property)
{
return new JProperty(property.Name, Visit(property.Value));
}
private static JContainer CreateJContainer(JTokenType tokenType)
{
switch (tokenType)
{
case JTokenType.Object: return new JObject();
case JTokenType.Array: return new JArray();
default: throw new ArgumentOutOfRangeException($"Invalid type: {tokenType}");
}
}
}
public class PropertyNameTrimmer : JsonVisitor
{
protected override JProperty VisitProperty(JProperty property)
{
return new JProperty(property.Name.Trim(), Visit(property.Value));
}
}
public class TypeResolver : JsonVisitor
{
private readonly string _typePropertyName;
private readonly Func<string, string> _resolveType;
public TypeResolver(string typePropertyName, Func<string, string> resolveType)
{
_typePropertyName = typePropertyName;
_resolveType = resolveType;
}
protected override JProperty VisitProperty(JProperty property)
{
return
property.Name == _typePropertyName
? new JProperty("$type", _resolveType(property.Value.Value<string>()))
: base.VisitProperty(property);
}
}
class JsonVisitor
{
public JToken Visit(JToken jToken)
{
return
jToken is JValue
? jToken
: VisitInternal(jToken, CreateJContainer(jToken.Type));
}
private JToken VisitInternal(JToken jToken, JContainer result)
{
if (jToken is JValue)
{
return jToken;
}
foreach (var element in jToken)
{
switch (element)
{
case JProperty jProperty:
var visitedProperty = VisitProperty(jProperty.Name, Visit(jProperty.Value));
result.Add(visitedProperty);
break;
default:
result.Add(Visit(element));
break;
}
}
return result;
}
protected virtual JProperty VisitProperty(string name, JToken value) => new JProperty(name, value);
private static JContainer CreateJContainer(JTokenType type)
{
switch (type)
{
case JTokenType.Object: return new JObject();
case JTokenType.Array: return new JArray();
default: throw new ArgumentOutOfRangeException($"Invalid type: {type}");
}
}
}
Since I didn't have any other use cases yet, it's the only overridable API right now but I think it should be easeeasy to extend it in future.
class JsonVisitor
{
public JToken Visit(JToken jToken)
{
return
jToken is JValue
? jToken
: VisitInternal(jToken, CreateJContainer(jToken.Type));
}
private JToken VisitInternal(JToken jToken, JContainer result)
{
if (jToken is JValue)
{
return jToken;
}
foreach (var element in jToken)
{
switch (element)
{
case JProperty jProperty:
var visitedProperty = VisitProperty(jProperty.Name, Visit(jProperty.Value));
result.Add(visitedProperty);
break;
default:
result.Add(element);
break;
}
}
return result;
}
protected virtual JProperty VisitProperty(string name, JToken value) => new JProperty(name, value);
private static JContainer CreateJContainer(JTokenType type)
{
switch (type)
{
case JTokenType.Object: return new JObject();
case JTokenType.Array: return new JArray();
default: throw new ArgumentOutOfRangeException($"Invalid type: {type}");
}
}
}
Since I didn't have any other use cases yet, it's the only overridable API right now but I think it should be ease to extend it in future.
class JsonVisitor
{
public JToken Visit(JToken jToken)
{
return
jToken is JValue
? jToken
: VisitInternal(jToken, CreateJContainer(jToken.Type));
}
private JToken VisitInternal(JToken jToken, JContainer result)
{
if (jToken is JValue)
{
return jToken;
}
foreach (var element in jToken)
{
switch (element)
{
case JProperty jProperty:
var visitedProperty = VisitProperty(jProperty.Name, Visit(jProperty.Value));
result.Add(visitedProperty);
break;
default:
result.Add(Visit(element));
break;
}
}
return result;
}
protected virtual JProperty VisitProperty(string name, JToken value) => new JProperty(name, value);
private static JContainer CreateJContainer(JTokenType type)
{
switch (type)
{
case JTokenType.Object: return new JObject();
case JTokenType.Array: return new JArray();
default: throw new ArgumentOutOfRangeException($"Invalid type: {type}");
}
}
}
Since I didn't have any other use cases yet, it's the only overridable API right now but I think it should be easy to extend it in future.