C# Json Convert
Появилась проблема, Имеются ТЕСТ-кейсы, которые мы автоматизируем, соответственно у нас по дефолту есть кейс, предположим у нас есть json {"str": 2, "str2": "2"}, все что было int, станет string и наоборот (в основном только эти типы данных используются),
все бы хорошо и в этом случае от ненужной десериализации и дублирования кода в формате классов и полей спасали анонимные типы,
но сейчас же тела запросов стали невероятно гигантскими и и использовать в данном случае анонимные типы просто нецелесообразно, а при десериализации по факту будет дублирование кода на 200+ строк.
Написал метод, который вроде как должен переконвертить наш json
public static string ConvertTypes<T>(T data)
{
Dictionary<string, object> dict = new Dictionary<string, object>();
foreach (var item in data.GetType().GetProperties())
{
if (item.PropertyType.Name == "String")
{
dict.Add(item.Name, long.Parse(item.GetValue(data).ToString()));
}
else
{
dict.Add(item.Name, item.GetValue(data).ToString());
}
}
return JsonConvert.SerializeObject(dict);
}
Но пока есть проблема, нужно реализовать логику работы со вложенностями в данном методе.
File.ReadAllText также не особо подойдут, так требуется опционально получить некоторое поле и присвоить ему значение.
Подскажите варианты решения проблемы.
Ответы (1 шт):
Нашел решение, которое мне подошло и довольно близко к моей проблеме, возможно кому то понадобиться, в данном случае нет необходимости прибегать к рефлексии, можно решить через JToken:
using System;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
namespace JsonRecursiveDescent
{
class Program
{
static void Main(string[] args)
{
string json =
@"[
{
""X"":
{
""Title"":""foo"",
""xxxx"":""xxxx""
}
},
{
""Y"":
{
""ZZ"":
{
""Title"":""bar"",
""xxxx"":""xxxx""
}
}
}
]";
JToken node = JToken.Parse(json);
WalkNode(node, n =>
{
JToken token = n["Title"];
if (token != null && token.Type == JTokenType.String)
{
string title = token.Value<string>();
Console.WriteLine(title);
}
});
}
static void WalkNode(JToken node, Action<JObject> action)
{
if (node.Type == JTokenType.Object)
{
action((JObject)node);
foreach (JProperty child in node.Children<JProperty>())
{
WalkNode(child.Value, action);
}
}
else if (node.Type == JTokenType.Array)
{
foreach (JToken child in node.Children())
{
WalkNode(child, action);
}
}
}
}
}