JSON сериализация дженериков
У меня есть класс, который выглядел так:
public class MyData : IList<Tuple<double,double>>
Идея в том, что у вас есть список пар значений. Достаточно просто. Но я хотел, чтобы это было сериализовано так, чтобы оно выглядело как массив из массива значений типа double (т.е.double[][]
), а не список кортежей. Это должно выглядеть так при сериализации:
[[1,1],[2,2],[3,3]]
Итак, я создал простойJsonConverter
это сделает это. Это очень простоWriteJson
метод, который выглядит так:
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
var obj = value as MyData;
double[][] dataArray = (from dp in obj._data
select new[] { dp.Item1, dp.Item2 }).ToArray();
var ser = new JsonSerializer();
ser.Serialize(writer, dataArray);
}
И я украшаюMyData
с соответствующим атрибутом:
[JsonConverter(typeof(MyDataJsonConverter))]
public class MyData: IList<Tuple<double,double>>
И все работает отлично. Теперь, однако, я хочу расширить это и сделатьMyData
общий:
public class MyData<S,T>: IList<Tuple<S,T>>
И это, где я столкнулся с проблемами. Изначально я пытался сделатьMyDataJsonConverter
также общий:
[JsonConverter(typeof(MyDataJsonConverter<S,T>))]
public class MyData<S,T>: IList<Tuple<S,T>>
Но это не разрешено, потому что вы не можете использовать дженерики с атрибутами.
Так что я должен держатьMyDataJsonConverter
не универсальный, но мне нужно выяснить, как сгладить мою коллекцию кортежей в массив (предположительно изobject[][]
сейчас) так, чтобы при сериализации мои данные выглядели так:
[[1,2],[2,3]]
или же:
[["foo":1],["bar":2]]
или даже:
[["foo":"bar"],["what":"ever"]]
Есть идеи, как с этим справиться? ВWriteJson
Я больше не могу бросатьvalue
вMyData
потому что я не буду знать параметры типа, так что в этот момент все в значительной степени разваливается.
Я мог бы просто создать отдельные классы для каждой комбинации типов (так один дляTuple<double,double>
и один дляTuple<string,double>
и так далее ...), но мне было интересно, есть ли лучший способ, прежде чем я перейду на это грубой силой.