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;
}
}
}
최상의 성능을 위해 계약 해결 프로그램을 캐시할 수 있습니다.
이거 먹어봤어?
언급URL : https://stackoverflow.com/questions/11055225/configure-json-net-to-ignore-datacontract-datamember-attributes
'programing' 카테고리의 다른 글
| 오류: [PrivateRoute]가 컴포넌트가 아닙니다. 의 모든 구성 요소는 또는이어야 합니다. (0) | 2023.03.15 |
|---|---|
| json 파일을 가져오는 동안 Typescript 컴파일러 오류 발생 (0) | 2023.03.15 |
| jQuery - .getjson VS .ajax json (0) | 2023.03.15 |
| ERROR 404.3 JSON 파일을 찾을 수 없습니다. (0) | 2023.03.15 |
| Web API 이외의 모든 것을 /index.html로 라우팅하는 방법 (0) | 2023.03.15 |