ValueTuples在序列化时丢失其属性名称

mdo*_*wes 22 c# tuples json.net valuetuple

在尝试将命名值元组序列化为JSON字符串时,它会丢失分配给项目的名称

(string type, string text) myTypes = ("A", "I am an animal");
var cnvValue = JsonConvert.SerializeObject(myTypes);
Run Code Online (Sandbox Code Playgroud)

我期待序列化值为

{"type":"A","text":"我是动物"}

但实际结果是

{"Item1":"A","Item2":"我是动物"}

我有兴趣知道两件事

  • 为什么它会像那样
  • 如何获得预期的输出

Cai*_*ard 19

如何获得预期的输出

像这样的东西:

var myTypes = new{ type = "A", text = "I am an animal"};
var cnvValue = JsonConvert.SerializeObject(myTypes);
Run Code Online (Sandbox Code Playgroud)

如果你正在寻找一个类似的简洁方法,应该工作.ValueTuple虽然不在引擎盖下使用s(但是匿名类型); 这是我将你的问题解释为"如何在不完全声明类等的情况下生成这个预期的JSON"

  • 你正确地解释了它.我使用ValueTuples来做到这一点. (2认同)

Dam*_*ver 15

名称是编译器技巧.如果你看一下定义ValueTuple,你会看到它的字段名称只是Item1,Item2等等.

由于JsonConvert.SerializeObject编译以及你分配你可以使用在名之前汇编,它不能恢复的名字.

方法参数/返回类型使用属性进行修饰,这些属性指示方法的签名包含ValueTuples 时要使用的名称.这允许稍后编写的代码再次通过编译器"看到"名称,但这是"错误的方法",在这里有很多用处.

如何获得预期的输出

如果字段/属性的名称如此重要,则引入显式类型.

  • @ AvnerShahar-Kashtan*匿名类型*无论如何都不明确 (3认同)