programing

JSON을 설정합니다.NET에서 DataContract/DataMember 속성을 무시합니다.

sourcejob 2023. 3. 15. 19:33
반응형

JSON을 설정합니다.NET에서 DataContract/DataMember 속성을 무시합니다.

Microsoft JSON serializer와 JSON을 모두 사용하는 MVC3 프로젝트에 문제가 있습니다.그물.

Microsoft 의 시리얼 라이저에서는, Date Time 가 기본적으로 망가져 있기 때문에, JSON 으로 전환했습니다.이 문제를 피하기 위해 NET을 사용합니다.시리얼화하려는 클래스 중 일부가 DataContract/DataMember 속성을 가진 POCO라는 점을 제외하면 매우 효과적입니다.여러 위치에서 참조되는 어셈블리에 정의됩니다.또한 효율성을 위해 DataMembers로 표시되지 않은 다른 디스플레이 속성이 있습니다.예를 들어 고객

[DataContract]
public class Customer
{
   [DataMember]
   public string FirstName { get; set;}
   [DataMember]
   public string LastName { get; set;}
   public string FullName 
   {
       get
       {  return FirstName + " " + LastName; }
   }

}

이 를 통해 에서 해당 수 JSON과 되면 WCF는 Full Name을 JSON으로 사용할 수 .NET FullName이 합니다.[DataMember]연재하지 않습니다.JSON j j j j j j j j j j j?에 NET이 있는 .[DataContract]성이이? 츠요시

주의: 의 JavaScript Serializer 를 사용합니다.NET은 FullName 속성으로 정상적으로 동작하지만 DateTimes는 파손되어 있습니다.난 JSON이 필요해.NET은 이 클래스에 DataContract/DataMember 속성이 있다는 사실을 무시하고 표준 공개 필드 직렬화를 수행합니다.

Json을 사용하면 됩니다.Net의 Opt Out 속성.Data Contract보다 우선합니다.

[DataContract]
[JsonObject(MemberSerialization.OptOut)]

Amry가 말한 것처럼 당신은 당신의 IContractResolver를 사용할 수 있습니다.

유감스럽게도 Amry가 제공한 솔루션은 효과가 없었습니다.다음은 제가 작업을 할 수 있었던 솔루션입니다.

public class AllPropertiesResolver : DefaultContractResolver
{
    protected override JsonProperty CreateProperty(MemberInfo member, MemberSerialization memberSerialization)
    {
        JsonProperty property = base.CreateProperty(member, memberSerialization);

        //property.HasMemberAttribute = true;
        property.Ignored = false;

        //property.ShouldSerialize = instance =>
        //{
        //    return true;
        //};

        return property;
    }
}

몇 줄의 코멘트가 있습니다.이러한 코멘트는, 제 솔루션을 유효하게 하기 위해서 필요한 것은 아닙니다만, 아직 모릅니다.

이것은 Amry의 솔루션과 같은 용도입니다.

var json = JsonConvert.SerializeObject(result, new JsonSerializerSettings {
    ContractResolver = new AllPropertiesResolver()
});

이게 도움이 됐으면 좋겠네요!

저는 당신과 거의 관련된 문제가 있어서 Json을 통해 해결책을 찾을 수 있었습니다.NET의 코드그래서 최선의 해결책은 아닐지 모르지만, 나에게는 효과가 있다.

만의, 자기만의 이 필요합니다.IContractResolver 지나치게 DataContract존손하다NET의 규칙도 있기 때문에 원래 멤버 선택에 영향을 주는 옵션이 이 코드에 의해 덮어쓰게 됩니다).

class AllPropertiesResolver : DefaultContractResolver
{
    protected override List<MemberInfo> GetSerializableMembers(Type objectType)
    {
        return objectType.GetProperties()
            .Where(p => p.GetIndexParameters().Length == 0)
            .Cast<MemberInfo>()
            .ToList();
    }
}

다음으로 코드 사용 예를 제시하겠습니다.

var json = JsonConvert.SerializeObject(result, new JsonSerializerSettings {
    ContractResolver = new AllPropertiesResolver()
});

Json에 따라.NET 문서[DataMember]속성에 Json도 주석을 달면 속성이 무시됩니다.NET 고유의 어트리뷰트(예:[JsonProperty]상세한 것에 대하여는, 「Serialization Attributes」의 메뉴얼을 참조해 주세요.

Json.NET 속성은 표준보다 우선합니다.예를 들어 Json Property Attribute와 Data Member Attribute가 모두 속성에 존재하고 둘 다 이름을 커스터마이즈하면 Json Property Attribute의 이름이 사용됩니다.

문서에는 이름 속성만 기재되어 있습니다만, 제 경험상으로는[JsonProperty]또한 Atribute가 수행한 설정을 완전히 음영으로 만듭니다.[DataMember]기여하다.따라서 당신의 경우 실현 가능하다면 Json도 추가합니다.[DataMember] 주석을 무시해야 하는 속성에 대한 NET 특성입니다.

의 존재를 무시하는 경우DataContractAttribute추가 속성을 추가할 필요 없이 모든 유형에 대해 사용자 정의 계약 해결 프로그램이 올바른 솔루션입니다.다만, Json의 경우는.NET 9.0.1 Amry의 리졸바는 더 이상 작동하지 않습니다.둘랄리의 해결사는 작동하지만 로 표시된 모든 공공 자산을 직렬화하는 추가적인 부작용이 있습니다.DataContractAttribute그러나 기본 계약 해결사와 동일하게 동작하지 않으면 다음을 사용할 수 있습니다.

public class IgnoreDataContractContractResolver : DefaultContractResolver
{
    static MemberSerialization RemoveDataContractAttributeMemberSerialization(Type type, MemberSerialization memberSerialization)
    {
        if (memberSerialization == MemberSerialization.OptIn)
        {
            type = Nullable.GetUnderlyingType(type) ?? type;

            // Json.NET interprets DataContractAttribute as inherited despite the fact it is marked with Inherited = false
            // https://json.codeplex.com/discussions/357850
            // https://stackoverflow.com/questions/8555089/datacontract-and-inheritance
            // https://github.com/JamesNK/Newtonsoft.Json/issues/603
            // Thus we need to manually climb the type hierarchy to see if one is present.

            var dataContractAttribute = type.BaseTypesAndSelf().Select(t => t.GetCustomAttribute<DataContractAttribute>()).FirstOrDefault(a => a != null);
            var jsonObjectAttribute = type.GetCustomAttribute<JsonObjectAttribute>();

            if (dataContractAttribute != null && jsonObjectAttribute == null)
                memberSerialization = MemberSerialization.OptOut;
        }
        return memberSerialization;
    }

    protected override IList<JsonProperty> CreateProperties(Type type, MemberSerialization memberSerialization)
    {
        var properties = base.CreateProperties(type, RemoveDataContractAttributeMemberSerialization(type, memberSerialization));
        return properties;
    }

    protected override JsonObjectContract CreateObjectContract(Type objectType)
    {
        var contract = base.CreateObjectContract(objectType);
        contract.MemberSerialization = RemoveDataContractAttributeMemberSerialization(objectType, contract.MemberSerialization);
        return contract;
    }
}

public static class TypeExtensions
{
    public static IEnumerable<Type> BaseTypesAndSelf(this Type type)
    {
        while (type != null)
        {
            yield return type;
            type = type.BaseType;
        }
    }
}

최상의 성능을 위해 계약 해결 프로그램을 캐시할있습니다.

이거 먹어봤어?

IgnoreDataMemberAttribute

언급URL : https://stackoverflow.com/questions/11055225/configure-json-net-to-ignore-datacontract-datamember-attributes

반응형