- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我有一些 JSon 文件,我正在使用
JsonSerializer 序列化器 = new JsonSerializer();
t obj = (t)serializer.Deserialize(file, typeof(t));
对象的集合。其中,它们包含以下数据。 “truthtable”中的数组个数由“gates”的值决定
"gates" : 1,
"truthtable" : [ false, true ]
和
"gates" : 2,
"truthtable" : [ [ false, false ], [ false, true ] ]
如果我尝试将“truthtable”反序列化为以下属性,示例 1 将失败。
public List<List<bool>>truthtable { get; set; }
有什么方法可以将这两种不同类型的真值表反序列化为同一个对象?我试过构建自定义反序列化器,但 Json 将两者视为“JsonToken.StartArray”,因此无法区分。
理想情况下,我希望能够反序列化这两个示例,就好像它们是 bool 数组的数组一样。
编辑应该提到,我无法改变 Json 文件的创建方式。我无权访问他们的创作。
最佳答案
这个问题可以使用自定义 JsonConverter
来解决.转换器可以读取门的数量,然后填充 List<List<bool>>
因此。如果只有一个门,它可以将单个列表包装在外部列表中以使其与您的类(class)一起使用。
假设您尝试反序列化的类看起来像这样:
class Chip
{
public int Gates { get; set; }
public List<List<bool>> TruthTable { get; set; }
}
那么转换器可能看起来像这样:
class ChipConverter : JsonConverter
{
public override bool CanConvert(Type objectType)
{
return (objectType == typeof(Chip));
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
JObject jo = JObject.Load(reader);
Chip chip = new Chip();
chip.Gates = (int)jo["gates"];
JArray ja = (JArray)jo["truthtable"];
if (chip.Gates == 1)
{
chip.TruthTable = new List<List<bool>>();
chip.TruthTable.Add(ja.ToObject<List<bool>>());
}
else
{
chip.TruthTable = ja.ToObject<List<List<bool>>>();
}
return chip;
}
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
throw new NotImplementedException();
}
}
要使用转换器,请创建一个实例并将其添加到序列化程序的 Converters
中反序列化之前的集合:
serializer.Converters.Add(new ChipConverter());
或者,如果您愿意,可以使用 [JsonConverter]
注释您的类(class)改为属性:
[JsonConverter(typeof(ChipConverter))]
class Chip
{
...
}
这是一个展示转换器的演示(注意我在这里使用了 JsonConvert.DeserializeObject<T>()
而不是创建一个 JsonSerializer
实例,但它的工作方式相同):
class Program
{
static void Main(string[] args)
{
string json = @"
[
{
""gates"": 1,
""truthtable"": [ false, true ]
},
{
""gates"": 2,
""truthtable"": [ [ false, false ], [ false, true ] ]
}
]";
List<Chip> chips = JsonConvert.DeserializeObject<List<Chip>>(json,
new ChipConverter());
foreach (Chip c in chips)
{
Console.WriteLine("gates: " + c.Gates);
foreach (List<bool> list in c.TruthTable)
{
Console.WriteLine(string.Join(", ",
list.Select(b => b.ToString()).ToArray()));
}
Console.WriteLine();
}
}
}
输出:
gates: 1
False, True
gates: 2
False, False
False, True
关于c# - Json.net 反序列化为 JSON 中可能包含数组或嵌套数组的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21940989/
出于好奇,我尝试了一些原型(prototype)制作,但似乎只允许在第一个位置使用子例程的原型(prototype) &。 当我写作时 sub test (&$$) { do_somethin
我需要开发一个类似于 Android Play 商店应用程序或类似 this app 的应用程序.我阅读了很多教程,发现几乎每个教程都有与 this one 类似的例子。 . 我已经开始使用我的应用程
考虑一个表示“事件之间的时间”的列: (5, 40, 3, 6, 0, 9, 0, 4, 5, 18, 2, 4, 3, 2) 我想将这些分组到 30 个桶中,但桶会重置。期望的结果: (0, 1,
我是一名优秀的程序员,十分优秀!