source

태플은 어떻게 JSON과 시리얼화 및 시리얼화 해제합니까?

lovecheck 2023. 2. 17. 21:36
반응형

태플은 어떻게 JSON과 시리얼화 및 시리얼화 해제합니까?

저는 어떻게 하면Tuple<T1, T2, T3, ...>serialize 및 deserialize를 수행합니다.'json'과 'tuple'이라는 키워드로 검색했지만 원하는 것을 찾을 수 없었습니다.

테스트 대상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);
    }
}

요약

  • Tuple.Create("own","hehe",true)에 시리얼화하다{"Item1":"one","Item2":"hehe","Item3":true}

  • {"Item1":"one","Item2":"hehe","Item3":true}에 대해 역직렬화할 수 있다Tuple<string,string, bool>

  • Class Foo와 함께Tuple데이터, json 문자열로 시리얼화 할 수 있으며 문자열은 다시 시리얼화 할 수 있습니다.Class Foo.

만약 당신이 짧은 답을 찾고 있다면.JsonConvert를 사용하고 있습니다.

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

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

는 최소한의 바이올린을 만들었다.

.NET5 및 곧 출시됩니다.NET6를 사용하는 것이 권장됩니다.System.Text.Json뉴턴소프트를 능가합니다.이 시리얼라이저에서 중요한 것은 튜플과 관련하여JsonSerializerOptions선택IncludeFields그렇지 않으면 기본적으로는 태플 값이 제외됩니다.

또한 명명된 튜플은 표준으로 대체되는 통사설탕일 뿐이다.Item1,Item2컴파일러에 의한 표기법.이름을 포함하는 가장 간단한 방법은 익명 개체를 사용하는 것입니다.

다음은 최소한의 예입니다.(에 붙여넣을 수 있습니다.를 만지작거리다NET5 컴파일러)


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);
        
    }
}

출력:

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

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

위의 dotnetfiddle 링크에 Hinrich에게 감사드립니다.

같은 링크를 사용하여 Json 객체와 Tuples 사이에서 Conversion이 어떻게 동작하는지 알게 되었습니다.코드는 다음과 같습니다.

using System;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;

public class Program
{
    public static void Main()
    {

        var testTuple = Tuple.Create<int, string, bool>(1234, "foo", true);
        var serialized = JsonConvert.SerializeObject(testTuple);
        Console.WriteLine(serialized);
        JObject test = ((JObject)JsonConvert.DeserializeObject(serialized));
        string strSerialized = JsonConvert.SerializeObject(test);
        //Tuple<int, string, bool> testTuple1 = JsonConvert.DeserializeObject<Tuple<int, string, bool>>(serialized); // WORKs
        Tuple<int, string, bool> testTuple1 = JsonConvert.DeserializeObject<Tuple<int, string, bool>>(strSerialized); // WORKs
        Console.WriteLine(testTuple1.Item1.ToString());
    }
}

누군가 도움이 되길 바랍니다.

언급URL : https://stackoverflow.com/questions/16101115/how-does-a-tuple-serialize-to-and-deserialize-from-json

반응형