C# - 将 JSON 反序列化为 ValueTuple

ana*_*tol 4 c# serialization json json.net valuetuple

我正在尝试反序列化为[{"foo": "1", "bar": false}, {"foo": "2", "bar": false}]类型List<(string, bool)>

JsonConvert.DeserializeObject<List<(string foo, bool bar)>>(json)  
Run Code Online (Sandbox Code Playgroud)

但始终会获得默认值列表 - (null, false)

如何实现正确的反序列化?

PS 我对用于此目的的任何模型/类都不感兴趣。我需要确切的值元组。

Kri*_*fer 9

在 C#9 中,您可以创建一个 ValueTuplerecord并使用生成的解构函数来创建一个 ValueTuple。我确实看到您不想声明模型,但这是我发现的最接近的方法:

声明记录:

private record FooBar(string foo, bool bar);

反序列化和解构:

(string foo, bool bar) = JsonConvert.DeserializeObject<FooBar>(json);

或者

var (foo, bar) = JsonConvert.DeserializeObject<FooBar>(json);


Pau*_*ado 6

创建 C# 元组功能是为了表示值集,而不是实体。

值的名称就像变量的名称。与变量名称一样,元组值名称仅存在于源代码中。

(string foo, bool bar)实际上,只是ValueTuple<string, int>。就像(string bar, bool foo)

(string foo, bool bar) a = ('one', true);
(string bar, bool foo) b = a;
Run Code Online (Sandbox Code Playgroud)

元组值存储在名为 的字段中Item1Item2依此类推。

在这里亲自看看它是如何工作的。

如果您热衷于为此使用值元组,则必须自己反序列化:

var json = "[{\"foo\": \"1\", \"bar\": false}, {\"foo\": \"2\", \"bar\": false}]";

var jArray = JsonConvert.DeserializeObject<JArray> (json);

var list = new List<(string foo, bool bar)>();

foreach (var item in jArray)
{
    list.Add((item.Value<string>("foo"), item.Value<bool>("bar")));
}
Run Code Online (Sandbox Code Playgroud)