ValueTuples失去他们的属性名称序列化时

问题描述 投票:18回答:3

虽然试图序列命名值元组JSON字符串,它失去了分配给项目的名称

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

我期待序列化的价值

{“类型”:“A”,“文”:“我是一个动物”}

但实际的结果是

{“项目1”:“A”,“项目2”:“我是一个动物”}

有两件事情,我有兴趣知道

  • 它为什么会那样,
  • 如何获得预期的输出
c# json.net tuples valuetuple
3个回答
20
投票

如何获得预期的输出

事情是这样的:

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

如果你正在寻找一个同样简洁的方法应该工作。不使用引擎盖下虽然ValueTuples(但匿名类型);这是我的解释你的问题是“我怎么能产生这种预期的JSON而不去声明类等的严重程度”


16
投票

名字是一个编译器的伎俩。如果你看一下定义ValueTuple你会看到它的字段名称只是Item1Item2等。

由于JsonConvert.SerializeObject编译以及你分配你可以在你的编译过程中使用的名称之前,不能恢复的名字。

方法参数/返回类型与attributes指示当一个方法的签名包括ValueTuples使用的名称装饰。这使得后来创作的“看”编译器再次捉弄人的姓名代码,但是这是“绕错误的方式”多大用处的这里。

如何获得预期的输出

引进一个明确的类型,如果该字段的名称/性能是非常重要的。


2
投票

如何获得预期的输出

在@Caius答案使用显式自定义类型或匿名类等。

或者根本就不为它创建特殊类型(匿名类型编译器生成的场景在你身后类),并使用JObject动态创建JSON:

var myTypesJson = new JObject(
    new JProperty("type", "A"), 
    new JProperty("text", "I am an animal")
);
var cnvValue = myTypesJson.ToString();

或使用索引和初始化syntax吧:

var createdJson = new JObject()
{
    ["type"] = "A",
    ["text"] = "I am an animal"
};
var cnvValue = createdJson.ToString();
© www.soinside.com 2019 - 2024. All rights reserved.