Конвертер не применяется к спискам, элементы которых также сериализуются как коллекции. , например List
Проблема в том, что мне нужно десериализовать массив, который может быть массивом строк, или это может быть быть массивом массивов строк. Итак, в примере говорится, что в моем случае это не сработает.
Например,
Код: Выделить всё
{"values": [ "foo", "bar" ]}
Код: Выделить всё
{"values": [ [ "foo", "bar" ], [ "baz", "qux" ] ]}
Код: Выделить всё
public class SingleOrArray : ICollection
{
public bool IsArray { get; set; } = false;
public T Value { get; set; }
public T[] Values { get { return _items.ToArray() } }
private List _items = new();
// etc.
}
Код: Выделить всё
public class MyObject
{ [JsonConverter(typeof(SingleOrArrayCollectionConverter))]
public List Value { get; set; }
}
Вот мои модульные тесты, которые проходят успешно, но я нужно, чтобы он обрабатывал строку[] в этом случае:
Код: Выделить всё
[Fact]
public void SingleItemTest()
{
// Arrange
var testData = "{ \"value\": \"a\" }";
// Act
var target = JsonConvert.DeserializeObject(testData);
// Assert
Assert.False(target!.Value.IsArray);
Assert.Equal("a", target!.Value.Value);
}
[Fact]
public void ArrayItemTest1()
{
// Arrange
var testData = "{ \"value\": [\"a\"] }";
// Act
var target = JsonConvert.DeserializeObject(testData);
// Assert
Assert.True(target!.Value.IsArray);
Assert.Equal("a", target!.Value.Values[0]);
}
- должен стать
Код: Выделить всё
[ "foo","bar" ]
т.е. [["foo","bar"]], а не [["foo"],["bar"]].Код: Выделить всё
SingleOrArray { IsArray = false, Value = string["foo", "bar"] }
- Смешанные случаи, такие как ["foo",["bar"]], можно пропустить.
Подробнее здесь: https://stackoverflow.com/questions/791 ... ay-of-an-a