Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
json C#7元组支持_Json_Tuples_C# 7.0 - Fatal编程技术网

json C#7元组支持

json C#7元组支持,json,tuples,c#-7.0,Json,Tuples,C# 7.0,我想在JSON(Newtonsoft.JSON)输出中获得我的C#7元组属性名。 我的问题是: 当我想将元组转换为不支持参数名称的JSON格式时 例如,这是我的“Test2”方法,您可以看到JSON输出: public void Test2() { var data = GetMe2("ok"); var jsondata = JsonConvert.SerializeObject(data);//JSON output is {"Item1":5,"Item2":"ok ali

我想在JSON(Newtonsoft.JSON)输出中获得我的C#7元组属性名。 我的问题是: 当我想将元组转换为不支持参数名称的JSON格式时

例如,这是我的“Test2”方法,您可以看到JSON输出:

public void Test2()
{
    var data = GetMe2("ok");
    var jsondata = JsonConvert.SerializeObject(data);//JSON output is {"Item1":5,"Item2":"ok ali"}
}

public (int MyValue, string Name) GetMe2(string name)
{
    return (5, name + " ali");
}
JSON输出是“{”Item1:5,“Item2”:“ok ali”}”,但我想要“{”MyValue:5,“Name”:“ok ali”}”

这并非不可能,因为我可以在运行时获取属性名称:

foreach (var item in this.GetType().GetMethods())
{
    dynamic attribs = item.ReturnTypeCustomAttributes;
    if (attribs.CustomAttributes != null && attribs.CustomAttributes.Count > 0)
    {
        foreach (var at in attribs.CustomAttributes)
        {
            if (at is System.Reflection.CustomAttributeData)
            {
                var ng = ((System.Reflection.CustomAttributeData)at).ConstructorArguments;
                foreach (var ca in ng)
                {
                    foreach (var val in (IEnumerable<System.Reflection.CustomAttributeTypedArgument>)ca.Value)
                    {
                        var PropertyNameName = val.Value;
                        Console.WriteLine(PropertyNameName);//here is property names of C#7 tuple
                    }
                }
            }
        }
        dynamic data = attribs.CustomAttributes[0];
        var data2 = data.ConstructorArguments;
    }

}
foreach(此.GetType().GetMethods()中的变量项)
{
动态属性=item.ReturnTypeCustomAttributes;
if(attribs.CustomAttributes!=null&&attribs.CustomAttributes.Count>0)
{
foreach(attribs.CustomAttributes中的var at)
{
if(at is System.Reflection.CustomAttributeData)
{
var ng=((System.Reflection.CustomAttributeData)at).constructor参数;
foreach(var ca in ng)
{
foreach(变量值在(IEnumerable)ca.Value中)
{
var PropertyNameName=val.Value;
Console.WriteLine(PropertyNameName);//这里是C#7元组的属性名
}
}
}
}
动态数据=attribs.CustomAttributes[0];
var data2=data.ConstructorArguments;
}
}

对于这里的特定情况,这是不可能的。这是因为
SerializeObject
无法找到元组的来源,它只能看到
ValueTuple


如果使用元组属性序列化对象,情况会有所不同,在这种情况下,
SerializeObject
可以使用反射来查找
TupleElementNames
属性(即使它当前没有)。

简短的回答是元组没有属性

元组是一组值,主要用于从方法返回多个值

它们从未打算对实体进行建模

如果不想为此创建类型,解决问题的唯一方法是:

public void Test2()
{
    var data = GetMe2("ok");
    var jsondata = JsonConvert.SerializeObject(new { data.MyValue, data.Name });//JSON output is {"Item1":5,"Item2":"ok ali"}
}

啊,我知道这也是你的问题。一般来说,GitHub issue tracker比StackOverflow更容易回答此类特定于库的问题。我们只能帮助您实现某种自定义方法或crutch解决方案。当您发现在Json.NET中还没有实现堆栈溢出问题,并且有一个功能请求时,为什么还要问这个问题?是的,在添加问题ty之前,我看到了这一点。“我希望在我的情况下,任何人都可以更改Json开源项目”。你不能成为“任何人”有什么原因吗?获取源代码,进行更改并提交PR,而不是等待其他人为您执行。TupleElementNames不是仅应用于方法的返回值吗?@PauloMorgado I在“方法”中包含属性。我确实忘了提到字段。然而,它附加到元组的起源,而不是元组本身。序列化程序可能会进行特殊处理,但您建议这样做吗?我不会。我不确定这是否不可能。例如,您可以为Dapper提供一个元组,它将成功返回一个填充元组的IEnumerable。我不知道为什么Newtonsoft不能做同样的事情。@Zorthgo这里的问题是JSON.NET不能读取元组字段的名称。据推测,Dapper依赖于字段的顺序,而不是它们的名称。您可以序列化字段,但元组没有命名字段,它只是Item1、Item2等。这些名称是“just”编译器的魔法这段代码真的解决了问题吗?OP;所需的输出是
{“MyValue”:5,“Name”:“ok ali”}