【问题标题】:json C# 7 Tuple Supportjson C# 7 元组支持
【发布时间】:2017-05-24 09:55:25
【问题描述】:

我想在我的 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;
    }

}

【问题讨论】:

  • 啊,我知道这也是你的问题。一般来说,这类特定于库的问题在 GitHub 问题跟踪器上比在 StackOverflow 上更有可能得到回答。我们只能帮助您实施某种自定义方法或拐杖解决方案。
  • 为什么要问堆栈溢出问题你已经发现它还没有在 Json.NET 中实现,并且有一个功能请求?
  • 是的,我在添加问题之前看到了。
  • “我希望任何人都可以在我的情况下更改 json 开源项目”。你有理由不能成为那个“任何人”吗?抓住源头,进行更改并提交 PR,而不是等待其他人为您完成。

标签: json tuples c#-7.0


【解决方案1】:

对于这里的具体情况,是不可能的。那是因为SerializeObject 无法找出元组的来源,它只能看到ValueTuple&lt;int, string&gt;

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

【讨论】:

  • TupleElementNames不是只应用于方法的返回值吗?
  • 我在“方法”中包含了属性。我确实忘了提及字段。然而,它与元组的起源有关,而不是元组本身。序列化程序可能会进行特殊处理,但您会推荐它吗?我不会。
  • 我不确定这是否不可能。例如,您可以为 Dapper 提供一个元组,它会成功返回一个已填充元组的 IEnumerable。我不确定为什么 Newtonsoft 不能做同样的事情。
  • @Zorthgo 这里的问题是 JSON.NET 无法读取元组字段的 names。据推测,Dapper 依赖于字段的顺序,而不是它们的名称。
【解决方案2】:

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

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

他们从未打算为实体建模。

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

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

【讨论】:

  • 您可以序列化字段,但元组没有命名字段,它只是 Item1、Item2 等。名称是“只是”编译器魔法
  • 这段代码真的能解决问题吗?操作;所需的输出是{"MyValue":5,"Name":"ok ali"}
猜你喜欢
  • 2015-11-12
  • 2018-02-11
  • 2018-03-02
  • 2012-03-19
  • 2012-01-20
  • 1970-01-01
  • 1970-01-01
  • 2021-11-15
  • 2015-02-12
相关资源
最近更新 更多