Skip to main content
Code Review

Return to Question

Commonmark migration
Source Link

###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));
}
Tweeted twitter.com/StackCodeReview/status/1068203092548730882
added factory methods and changed VisitProperty signature
Source Link
t3chb0t
  • 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);
 }
}
added 7 characters in body
Source Link
t3chb0t
  • 44.6k
  • 9
  • 84
  • 190
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.

Source Link
t3chb0t
  • 44.6k
  • 9
  • 84
  • 190
Loading
lang-cs

AltStyle によって変換されたページ (->オリジナル) /