元组如何从JSON序列化和反序列化?

Aec*_*Liu 31 c# json

我很好奇Tuple<T1, T2, T3, ...>序列化和反序列化.我使用关键字"json"和"tuple"搜索,但我找不到我想要的东西.

Aec*_*Liu 41

我测试了UnitTestJson.net,测试代码如下.结果显示Tuple<T1,T2,T3,...>可序列化和可反序列化.所以我可以在我的应用程序中使用它们.

测试代码

public class Foo {
    public List<Tuple<string, string, bool>> Items { get; set; }

    public Foo()
    {
        Items = new List<Tuple<string, string, bool>>();
    }

    public override string ToString()
    {
        StringBuilder sb = new StringBuilder();
        foreach (var a in Items)
        {
            sb.Append(a.Item1 + ", " + a.Item2 + ", " + a.Item3.ToString() + "\r\n");
        }
        return sb.ToString();
    }
}

[TestClass]
public class NormalTests
{
    [TestMethod]
    public void TupleSerialization()
    {
        Foo tests = new Foo();
        tests.Items.Add(Tuple.Create("one", "hehe", true));
        tests.Items.Add(Tuple.Create("two", "hoho", false));
        tests.Items.Add(Tuple.Create("three", "ohoh", true));

        string json = JsonConvert.SerializeObject(tests);
        Console.WriteLine(json);

        var obj = JsonConvert.DeserializeObject<Foo>(json);
        string objStr = obj.ToString();
        Console.WriteLine(objStr);
    }
}
Run Code Online (Sandbox Code Playgroud)

评论

Tuple.Create("own","hehe",true)将序列化到字符串{"项目1":"一","项目2":"嘻嘻","项目3":真正},并且它可以被反序列化回Tuple<string,string,bool>类型.


Hin*_*ich 22

If you are looking for a short answer. I am using JsonConvert.

var testTuple = Tuple.Create(1234, "foo", true);
var serialized = JsonConvert.SerializeObject(testTuple);

Console.WriteLine(serialized);
// prints: {"Item1":1234,"Item2":"foo","Item3":true}
Run Code Online (Sandbox Code Playgroud)

I made a minimal fiddle.

  • 我怀疑这是因为OP的答案在这个答案之前有五年的时间来收集赞成票:) (3认同)
  • 老实说,我认为这个答案比得票最多的答案更有帮助。与得票最多的回答者的答案相比,“Tuple&lt;string, string&gt;”序列化为“{Item1: string, Item2: string}”更加清晰和直接。 (2认同)

The*_*ion 12

对于 .NET5 和即将推出的 .NET6,现在建议System.Text.Json通过 NewtonSoft 使用。对于这个序列化器来说,关于元组的重要事情是设置选项JsonSerializerOptionsIncludeFields否则默认情况下会排除元组值。

此外,命名元组只是语法糖,由编译器替换为标准Item1,符号。Item2要包含名称,最简单的方法是使用匿名对象

下面是一个最小的例子。(可以使用.NET5编译器粘贴到.NET fiddle中)


using System;
using System.Collections.Generic;
using System.Text.Json;
                    
public class Program
{
    public static void Main()
    {
        JsonSerializerOptions options = new() { IncludeFields = true };

        var testTuple = ("test" , "test1", 1324, false);
        var serializedTuple = JsonSerializer.Serialize(testTuple, options);
        Console.WriteLine(serializedTuple);
        
        var testTuple2 = (NamedItem1: "test" , NamedItemTwo: "test1", TheIntegersName: 1324, ThisBoolHasAFirstNameIts: false);
        var serializedTuple2 = JsonSerializer.Serialize(new {testTuple2.NamedItem1, testTuple2.NamedItemTwo, testTuple2.TheIntegersName, testTuple2.ThisBoolHasAFirstNameIts }, options);
        Console.WriteLine(serializedTuple2);
        
    }
}
Run Code Online (Sandbox Code Playgroud)

输出:

{"Item1":"test","Item2":"test1","Item3":1324,"Item4":false}

{"NamedItem1":"test","NamedItemTwo":"test1","TheIntegersName":1324,"ThisBoolHasAFirstNameIts":false}

  • 有没有办法将元组项的命名从“ItemN”更改为代码中的自定义名称?例如:`(int x, int y) point`应该输出`"point": { "x": 3, "y": 6 }`而不是`"point": { "Item1": 3, "Item2 “:6}`。 (2认同)