https://dotnetfiddle.net/R96sPn
Я пытаюсь создать AddJsonObject таким образом, чтобы name из External.AddParameter подчинялся тому, что ContractRevolver установлен для External.Serialize.
В приведенном ниже примере это оболочка из верблюжьей оболочки, но, как вы можете видеть, результат не в оболочке из верблюда. Изменение ContractResolver должно эффективно определять форматирование параметра name. К классу External нельзя добавить дополнительный код.
Это класс, который я не могу изменить:
public static class External
{
public static string Serialize(object obj)
{
JsonSerializer ser = new JsonSerializer{
ContractResolver = new Newtonsoft.Json.Serialization.CamelCasePropertyNamesContractResolver(),
NullValueHandling = NullValueHandling.Ignore
};
using (StringWriter stringWriter = new StringWriter())
{
using (JsonTextWriter jsonTextWriter = new JsonTextWriter((TextWriter)stringWriter))
{
jsonTextWriter.Formatting = Formatting.Indented;
jsonTextWriter.QuoteChar = '"';
ser.Serialize((JsonWriter)jsonTextWriter, obj);
return stringWriter.ToString();
}
}
}
public static void AddParameter(string name, string str)
{
Console.WriteLine(name + " : " + str);
}
}
Просто пример класса:
public class Product { public Product ChildProduct { get; set; } public string Name { get; set; } public DateTime Expiry { get; set; } public string[] Sizes { get; set; } }
Основной:
public class Program
{
public void AddJsonObject(object obj)
{
foreach (var property in obj.GetType().GetProperties())
{
var propValue = property.GetValue(obj, null);
External.AddParameter(property.Name, External.Serialize(propValue));
}
}
public void Main()
{
Product product = new Product();
product.Name = "Apple";
product.Expiry = new DateTime(2008, 12, 28);
product.Sizes = new string[]{"small", "big"};
product.ChildProduct = new Product();
AddJsonObject(product);
}
}
Выход:
ChildProduct : {
"expiry": "0001-01-01T00:00:00"
}
Name : "Apple"
Expiry : "2008-12-28T00:00:00"
Sizes : [
"small",
"big"
]
Желаемый результат:
childProduct : {
"expiry": "0001-01-01T00:00:00"
}
name : "Apple"
expiry : "2008-12-28T00:00:00"
sizes : [
"small",
"big"
]
Эта демонстрация демонстрирует сериализацию с использованием JSON.net с CamelCase, но AddJsonObject должен работать независимо от того, какой сериализатор json они используют или какое форматирование. Этот пример просто демонстрирует нетривиальный пример.
Моя первоначальная попытка заключалась в том, чтобы поместить объект в родительский объект. External.Serialize() объект-оболочка затем каким-то образом передает результаты в AddParameter, так что name является выходом сериализации - не удалось заставить это работать правильно.





Измените строку, в которой вы инициализируете ContractResolver (ContractResolver = new Newtonsoft.Json.Serialization.CamelCasePropertyNamesContractResolver()), на
ContractResolver = new DefaultContractResolver
{
NamingStrategy = new CamelCaseNamingStrategy()
};
Хорошо, у меня есть решение, которое работает, но я воздержусь от умных ответов.
public void AddJsonObject(object obj)
{
var jsonObj = JObject.Parse(External.Serialize(obj));
foreach (var property in jsonObj.Properties())
{
External.AddParameter(property.Name, External.Serialize( property.Value));
}
}
Это в
External, который я не могу контролировать, если и как они настраивают сериализатор json, я могу использовать только его, и мой AddJsonObject должен ему подчиняться.