Skip to content

Instantly share code, notes, and snippets.

@davidwhitney
Created September 29, 2015 12:44
Show Gist options
  • Select an option

  • Save davidwhitney/a38ebcf5e397b90ffef9 to your computer and use it in GitHub Desktop.

Select an option

Save davidwhitney/a38ebcf5e397b90ffef9 to your computer and use it in GitHub Desktop.
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