Created
September 29, 2015 12:44
-
-
Save davidwhitney/a38ebcf5e397b90ffef9 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| using System; | |
| using System.Collections.Generic; | |
| using System.IO; | |
| using System.Linq; | |
| using System.Text; | |
| using System.Threading.Tasks; | |
| using Newtonsoft.Json; | |
| using NUnit.Framework; | |
| namespace ClassLibrary1 | |
| { | |
| [TestFixture] | |
| public class Tests | |
| { | |
| private JsonSearch _search; | |
| [SetUp] | |
| public void Setup() | |
| { | |
| _search = new JsonSearch(); | |
| } | |
| [Test] | |
| public void GivenMostTrivialJson_SearchForStringThatExists_ReturnsPropName() | |
| { | |
| var path = _search.Find("{ \"name\": \"William Shakespeare\" }", "peare"); | |
| Assert.That(path, Is.EqualTo("name")); | |
| } | |
| [Test] | |
| public void GivenNestedJson_SearchForStringThatExists_ReturnsPropName() | |
| { | |
| var path = _search.Find("{\"blah\": \"deblah\", \"subname\": { \"name\": \"William Shakespeare\" } }", "peare"); | |
| Assert.That(path, Is.EqualTo("subname -> name")); | |
| } | |
| [Test] | |
| public void GivenJsonWithResultInArray_SearchForStringThatExists_ReturnsPropName() | |
| { | |
| var path = _search.Find("{\"blah\": \"deblah\", \"subname\": [ \"William Shakespeare\" ] }", "peare"); | |
| Assert.That(path, Is.EqualTo("subname -> 0")); | |
| } | |
| [Test] | |
| public void GivenJsonWithResultDeepInArray_SearchForStringThatExists_ReturnsPropName() | |
| { | |
| var path = _search.Find("{\"blah\": \"deblah\", \"subname\": [ \"David\", \"William Shakespeare\" ] }", "peare"); | |
| Assert.That(path, Is.EqualTo("subname -> 1")); | |
| } | |
| [Test] | |
| public void Input1Test() | |
| { | |
| var contents = File.ReadAllText("input1.txt"); | |
| var path = _search.Find(contents, "dailyprogrammer"); | |
| Assert.That(path, Is.EqualTo("favoriteWebsites -> 1")); | |
| } | |
| [Test] | |
| public void Input2Test() | |
| { | |
| var contents = File.ReadAllText("input2.txt"); | |
| var path = _search.Find(contents, "dailyprogrammer"); | |
| Assert.That(path, Is.EqualTo("caki -> cyd -> qembsejm -> 1")); | |
| } | |
| [Test] | |
| public void Challenge1Test() | |
| { | |
| var contents = File.ReadAllText("challenge1.txt"); | |
| var path = _search.Find(contents, "dailyprogrammer"); | |
| Assert.That(path, Is.EqualTo("axvjf -> tskgrsi -> 0 -> ozr -> 0 -> 1 -> 0")); | |
| } | |
| [Test] | |
| [Ignore] | |
| public void Challenge2Test() | |
| { | |
| var contents = File.ReadAllText("challenge2.txt"); | |
| var path = _search.Find(contents, "dailyprogrammer"); | |
| Assert.That(path, Is.EqualTo("myutkqsfzw -> 4 -> fxeu -> 1 -> 0 -> 1 -> 2 -> 7 -> ocjcjokh -> xqfbrz -> 0")); | |
| } | |
| } | |
| public class JsonSearch | |
| { | |
| public string Find(string json, string searchTerm, Queue<string> path = null) | |
| { | |
| path = path ?? new Queue<string>(); | |
| var values = JsonConvert.DeserializeObject<Dictionary<string, object>>(json); | |
| foreach (var keyValuePair in values) | |
| { | |
| ProcessInnerJson(searchTerm, path, keyValuePair); | |
| } | |
| return string.Join(" -> ", path); | |
| } | |
| private void ProcessInnerJson(string searchTerm, Queue<string> path, KeyValuePair<string, object> pair) | |
| { | |
| if (pair.Value == null) | |
| { | |
| return; | |
| } | |
| var innerJson = pair.Value.ToString(); | |
| if (innerJson.Contains(searchTerm)) | |
| { | |
| path.Enqueue(pair.Key); | |
| } | |
| if (innerJson.StartsWith("[")) | |
| { | |
| ScanArray(searchTerm, path, innerJson); | |
| return; | |
| } | |
| if (innerJson.Contains("{")) | |
| { | |
| Find(innerJson, searchTerm, path); | |
| } | |
| } | |
| private void ScanArray(string searchTerm, Queue<string> path, string innerJson) | |
| { | |
| var array = JsonConvert.DeserializeObject<List<object>>(innerJson); | |
| for (var index = 0; index < array.Count; index++) | |
| { | |
| ProcessInnerJson(searchTerm, path, new KeyValuePair<string, object>(index.ToString(), array[index])); | |
| } | |
| } | |
| } | |
| } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment