虽然试图序列命名值元组JSON字符串,它失去了分配给项目的名称
(string type, string text) myTypes = ("A", "I am an animal");
var cnvValue = JsonConvert.SerializeObject(myTypes);
我期待序列化的价值
{“类型”:“A”,“文”:“我是一个动物”}
但实际的结果是
{“项目1”:“A”,“项目2”:“我是一个动物”}
有两件事情,我有兴趣知道
如何获得预期的输出
事情是这样的:
var myTypes = new{ type = "A", text = "I am an animal"};
var cnvValue = JsonConvert.SerializeObject(myTypes);
如果你正在寻找一个同样简洁的方法应该工作。不使用引擎盖下虽然ValueTuple
s(但匿名类型);这是我的解释你的问题是“我怎么能产生这种预期的JSON而不去声明类等的严重程度”
名字是一个编译器的伎俩。如果你看一下定义ValueTuple
你会看到它的字段名称只是Item1
,Item2
等。
由于JsonConvert.SerializeObject
编译以及你分配你可以在你的编译过程中使用的名称之前,不能恢复的名字。
方法参数/返回类型与attributes指示当一个方法的签名包括ValueTuple
s使用的名称装饰。这使得后来创作的“看”编译器再次捉弄人的姓名代码,但是这是“绕错误的方式”多大用处的这里。
如何获得预期的输出
引进一个明确的类型,如果该字段的名称/性能是非常重要的。
如何获得预期的输出
在@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();