Added option for parsing JSON via JTokens (thanks ewwink).

This commit is contained in:
ruri
2019-05-21 16:08:37 +02:00
parent 838eea84ab
commit 4e2554ad18
4 changed files with 23 additions and 7 deletions
+1 -1
View File
@@ -323,7 +323,7 @@ This will spawn and execute a Parse Block.
Syntax: Syntax:
PARSE "TARGET" LR "LEFT" "RIGHT" [Recursive?] [EncodeOutput?] [CreateEmpty?] [UseRegexLR?] -> VAR/CAP "NAME" ["PREFIX" "SUFFIX"] PARSE "TARGET" LR "LEFT" "RIGHT" [Recursive?] [EncodeOutput?] [CreateEmpty?] [UseRegexLR?] -> VAR/CAP "NAME" ["PREFIX" "SUFFIX"]
PARSE "TARGET" CSS "SELECTOR" "ATTRIBUTE" [INDEX / Recursive?] [EncodeOutput?] [CreateEmpty?] -> VAR/CAP "NAME" ["PREFIX" "SUFFIX"] PARSE "TARGET" CSS "SELECTOR" "ATTRIBUTE" [INDEX / Recursive?] [EncodeOutput?] [CreateEmpty?] -> VAR/CAP "NAME" ["PREFIX" "SUFFIX"]
PARSE "TARGET" JSON "FIELD" [Recursive?] [EncodeOutput?] [CreateEmpty?] -> VAR/CAP "NAME" ["PREFIX" "SUFFIX"] PARSE "TARGET" JSON "FIELD" [JTokenParsing?] [Recursive?] [EncodeOutput?] [CreateEmpty?] -> VAR/CAP "NAME" ["PREFIX" "SUFFIX"]
PARSE "TARGET" REGEX "REGEX" "OUTPUT" [Recursive?] [EncodeOutput?] [CreateEmpty?] -> VAR/CAP "NAME" ["PREFIX" "SUFFIX"] PARSE "TARGET" REGEX "REGEX" "OUTPUT" [Recursive?] [EncodeOutput?] [CreateEmpty?] -> VAR/CAP "NAME" ["PREFIX" "SUFFIX"]
Examples: Examples:
@@ -125,6 +125,7 @@
<Label Content="Field Name:"/> <Label Content="Field Name:"/>
<TextBox Text="{Binding JsonField, UpdateSourceTrigger=PropertyChanged}"/> <TextBox Text="{Binding JsonField, UpdateSourceTrigger=PropertyChanged}"/>
</DockPanel> </DockPanel>
<CheckBox Content="Use JToken Parsing" IsChecked="{Binding JTokenParsing}" VerticalContentAlignment="Center" ToolTip="Allows navigating through fields using . for children and [i] or [*] for arrays"/>
<StackPanel Orientation="Horizontal"> <StackPanel Orientation="Horizontal">
<CheckBox Content="Recursive" IsChecked="{Binding Recursive}" VerticalContentAlignment="Center"/> <CheckBox Content="Recursive" IsChecked="{Binding Recursive}" VerticalContentAlignment="Center"/>
<CheckBox Content="Encode Output" IsChecked="{Binding EncodeOutput}" VerticalContentAlignment="Center"/> <CheckBox Content="Encode Output" IsChecked="{Binding EncodeOutput}" VerticalContentAlignment="Center"/>
+1 -1
View File
@@ -30,7 +30,7 @@ CAPTCHA "URL" [Base64?] [SendScreenshot?] -> VAR "NAME"
<item name="PARSE"> <item name="PARSE">
PARSE "TARGET" LR "LEFT" "RIGHT" [Recursive?] [EncodeOutput?] [CreateEmpty?] [UseRegexLR?] -> VAR/CAP "NAME" ["PREFIX" "SUFFIX"] PARSE "TARGET" LR "LEFT" "RIGHT" [Recursive?] [EncodeOutput?] [CreateEmpty?] [UseRegexLR?] -> VAR/CAP "NAME" ["PREFIX" "SUFFIX"]
PARSE "TARGET" CSS "SELECTOR" "ATTRIBUTE" [INDEX / Recursive?] [EncodeOutput?] [CreateEmpty?] -> VAR/CAP "NAME" ["PREFIX" "SUFFIX"] PARSE "TARGET" CSS "SELECTOR" "ATTRIBUTE" [INDEX / Recursive?] [EncodeOutput?] [CreateEmpty?] -> VAR/CAP "NAME" ["PREFIX" "SUFFIX"]
PARSE "TARGET" JSON "FIELD" [Recursive?] [EncodeOutput?] [CreateEmpty?] -> VAR/CAP "NAME" ["PREFIX" "SUFFIX"] PARSE "TARGET" JSON "FIELD" [JTokenParsing?] [Recursive?] [EncodeOutput?] [CreateEmpty?] -> VAR/CAP "NAME" ["PREFIX" "SUFFIX"]
PARSE "TARGET" REGEX "REGEX" "OUTPUT" [Recursive?] [EncodeOutput?] [CreateEmpty?] -> VAR/CAP "NAME" ["PREFIX" "SUFFIX"] PARSE "TARGET" REGEX "REGEX" "OUTPUT" [Recursive?] [EncodeOutput?] [CreateEmpty?] -> VAR/CAP "NAME" ["PREFIX" "SUFFIX"]
</item> </item>
<item name="UTILITY"> <item name="UTILITY">
+20 -5
View File
@@ -103,6 +103,10 @@ namespace RuriLib
private string jsonField = ""; private string jsonField = "";
/// <summary>The name of the json field for which we want to retrieve the value.</summary> /// <summary>The name of the json field for which we want to retrieve the value.</summary>
public string JsonField { get { return jsonField; } set { jsonField = value; OnPropertyChanged(); } } public string JsonField { get { return jsonField; } set { jsonField = value; OnPropertyChanged(); } }
private bool jTokenParsing = false;
/// <summary>Whether to parse the json object using jtoken paths.</summary>
public bool JTokenParsing { get { return jTokenParsing; } set { jTokenParsing = value; OnPropertyChanged(); } }
#endregion #endregion
#region REGEX #region REGEX
@@ -239,6 +243,7 @@ namespace RuriLib
case ParseType.JSON: case ParseType.JSON:
writer writer
.Literal(JsonField) .Literal(JsonField)
.Boolean(JTokenParsing, "JTokenParsing")
.Boolean(Recursive, "Recursive") .Boolean(Recursive, "Recursive")
.Boolean(EncodeOutput, "EncodeOutput") .Boolean(EncodeOutput, "EncodeOutput")
.Boolean(CreateEmpty, "CreateEmpty"); .Boolean(CreateEmpty, "CreateEmpty");
@@ -428,11 +433,21 @@ namespace RuriLib
break; break;
case ParseType.JSON: case ParseType.JSON:
var jsonlist = new List<KeyValuePair<string, string>>(); if (JTokenParsing)
parseJSON("", original, jsonlist); {
foreach(var j in jsonlist) JObject json = JObject.Parse(original);
if (j.Key == ReplaceValues(jsonField, data)) var jsonlist = json.SelectTokens(jsonField, false);
list.Add(j.Value); foreach (var j in jsonlist)
list.Add(j.ToString());
}
else
{
var jsonlist = new List<KeyValuePair<string, string>>();
parseJSON("", original, jsonlist);
foreach (var j in jsonlist)
if (j.Key == ReplaceValues(jsonField, data))
list.Add(j.Value);
}
break; break;