source

Json을 사용하여 두 가지 데이터 유형이 될 수 있는 JSON 속성을 역직렬화하는 방법.그물

gigabyte 2023. 3. 10. 22:03
반응형

Json을 사용하여 두 가지 데이터 유형이 될 수 있는 JSON 속성을 역직렬화하는 방법.그물

Json을 쓰고 있어요.현재 진행 중인 프로젝트의 NET.외부 API에서 오브젝트인 속성을 가진 JSON을 수신하고 있지만, 비어 있으면 false가 전달됩니다.

예를 들어 다음과 같습니다.

data: {
    supplier: {
        id: 15,
        name: 'TheOne'
    }
}

다음과 같은 경우도 있습니다.

data: {
    supplier: false
}

공급업체가 공급업체 개체 또는 null로 역직렬화되도록 공급업체 속성을 정의하려면 어떻게 해야 합니까?

현재 저는 다음을 가지고 있습니다.

public class Data {
   [JsonProperty("supplier")]
   public SupplierData Supplier { get; set; }
}
public class SupplierData {
    [JsonProperty("id")]
    public int Id { get; set; }
    [JsonProperty("name")]
    public string Name { get; set; }
}

그러나 이제 공급업체의 값이 '거짓'일 때 역직렬화하려고 하면 실패합니다.JSON 값이 'false'일 때 공급업체 속성을 null로 하고 싶습니다.

누가 이걸 어떻게 하는지 알았으면 좋겠어요.감사해요.

이 문제는 고객의 요구에 맞게 커스터마이즈하여 해결할 수 있습니다.SupplierDataclass. 컨버터의 외관은 다음과 같습니다.

class SupplierDataConverter : JsonConverter
{
    public override bool CanConvert(Type objectType)
    {
        return (objectType == typeof(SupplierData));
    }

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        JToken token = JToken.Load(reader);
        if (token.Type == JTokenType.Object)
        {
            return token.ToObject<SupplierData>();
        }
        return null;
    }

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        serializer.Serialize(writer, value);
    }
}

이 기능을 사용하려면 다음 명령어를 추가하기만 하면 됩니다.[JsonConverter]의 탓으로 돌리다Supplier소유물Data다음과 같은 클래스:

public class Data
{
    [JsonProperty("supplier")]
    [JsonConverter(typeof(SupplierDataConverter))]
    public SupplierData Supplier { get; set; }
}

다음은 컨버터의 작동 시연입니다.이 데모에서는 다음 명령어를 포함하는 오브젝트가 있는 것을 전제로 하고 있습니다.data당신이 질문한 JSON은 스스로 설 수 없기 때문입니다.저는 다음 클래스를 정의했습니다.RootObject이 목적을 위해:

public class RootObject
{
    [JsonProperty("data")]
    public Data Data { get; set; }
}

실제 데모 코드는 다음과 같습니다.

class Program
{
    static void Main(string[] args)
    {
        string json = @"
        {
            ""data"": 
            {
                ""supplier"": 
                {
                    ""id"": 15,
                    ""name"": ""TheOne""
                }
            }
        }";

        Console.WriteLine("--- first run ---");
        RootObject obj = JsonConvert.DeserializeObject<RootObject>(json);
        DumpSupplier(obj.Data.Supplier);

        json = @"
        {
            ""data"": 
            {
                ""supplier"": false
            }
        }";

        Console.WriteLine("--- second run ---");
        obj = JsonConvert.DeserializeObject<RootObject>(json);
        DumpSupplier(obj.Data.Supplier);
    }

    static void DumpSupplier(SupplierData supplier)
    {
        if (supplier != null)
        {
            Console.WriteLine("Id: " + supplier.Id);
            Console.WriteLine("Name: " + supplier.Name);
        }
        else
        {
            Console.WriteLine("(null)");
        }
        Console.WriteLine();
    }
}

위의 출력은 다음과 같습니다.

--- first run ---
Id: 15
Name: TheOne

--- second run ---
(null)

언급URL : https://stackoverflow.com/questions/20432166/how-to-deserialize-a-json-property-that-can-be-two-different-data-types-using-js

반응형