programing

JSON.Net 시리얼라이저가 JsonProperty를 무시합니까?

luckcodes 2023. 4. 3. 23:36

JSON.Net 시리얼라이저가 JsonProperty를 무시합니까?

다음 엔티티 클래스가 있습니다.

public class FacebookComment : BaseEntity
{
    [BsonId(IdGenerator = typeof(ObjectIdGenerator))]
    [BsonRepresentation(MongoDB.Bson.BsonType.ObjectId)]
    [JsonProperty("_id")]
    public ObjectId Id { get; set; }

    public int? OriginalId { get; set; }
    public DateTime Date { get; set; }
    public string Message { get; set; }
    public string Sentiment { get; set; }
    public string Author { get; set; }
}

이 오브젝트가 JSON에 시리얼화되면 Id 필드를 "_id":{...}"로 쓰고 싶습니다.AFIK는 원하는 속성명을 JsonProperty 속성에 전달하기만 하면 됩니다.그렇게 하면 됩니다.하지만 JsonConvert에 전화를 걸면.Serialize Object. 내 속성을 무시하고 대신 렌더링합니다.

{
    Author: "Author name",
    Date: "/Date(1321419600000-0500)/",
    DateCreated: "/Date(1323294923176-0500)/",
    Id: {
        CreationTime: "/Date(0)/",
        Increment: 0,
        Machine: 0,
        Pid: 0,
        Timestamp: 0
    },
    Message: "i like stuff",
    OriginalId: null,
    Sentiment: "Positive"
}

보시다시피 ID 필드가 잘못된 필드 이름으로 렌더링되고 있습니다.

좋은 생각 있어요?이 문제에 대해 1시간 동안 작업했는데, 시리얼라이저가 Json Property를 무시하는 것처럼 보이는 이유를 알 수 없습니다.

건설적인 입력은 대단히 감사합니다.

간단한 답변: 모든 어셈블리가 동일한 JSON을 참조하고 있는지 확인하십시오.NET DLL아마 지금 일어나고 있는 일은,[JsonProperty]하나의 어셈블리에 있는 하나의 DLL에서 다른 어셈블리를 찾고 있는 오브젝트를 시리얼화한다.[JsonProperty]CLR 오브젝트타입이 다르기 때문에 사실상 무시되고 있습니다.


답변:나는 단지 이 문제가 있었지만 다행히 나는 함께 일하는 수업이 하나 있었기 때문에JsonProperty하지만 탐정 일은 할 수 없었어요

비노동계급을 최소값까지 제거하고 노동계급과 비교해보니 비노동계급이 다른 어셈블리에 있다는 것 외에는 어떤 차이도 볼 수 없었습니다.

내가 수업을 다른 어셈블리로 옮겼을 때, 그것은 정상적으로 작동했다.

네임스페이스의 JSON 시리얼라이제이션에 대해 알아보려고 잠시 둘러보았지만, 해당되지 않는 것 같아서 레퍼런스를 살펴보니 확실히 엔티티 DLL의 오래된 JSONNET 3.5 DLL과 메인 프로젝트 파일의 NUGET 4.5 버전을 참조하고 있었습니다.

이것은 두 가지 예를 제시합니다.[JsonProperty]attribute(일반 클래스일 뿐)는 이름이 같다고 해서 serializer가 attribute를 인식하는 것도 아닙니다.

같은 문제가 있었습니다.Net Core 3.1)를 사용하고 있는 이유는JsonPropertyName주석, 에 있습니다.System.Text.Json.dll단, 을 사용하여JsonConvert.Serialize(string)이것은 분명히 에 있습니다.Newtonsoft.Json.dll. 시리얼라이제이션 기능은 자신의 라이브러리 주석만 존중하는 것 같습니다.변화하는JsonPropertyName ann 。JsonPropertyNewtonsoft.Json.dll

이 글은 나에게 도움이 되었다.

시리얼라이저 사용:

new JavaScriptSerializer().Serialize(message)

하지만, 이것을 엄격하게 사용하세요.

JsonConvert.SerializeObject(message);

제 경우 Json Property atrtibute를 속성으로 적용하고 있었는데, asp.net core 3.1을 사용하고 있었기 때문에 System에서 입력합니다.JSON의 유형이 아닌 Text.Json이 사용되었습니다.Net. 따라서 asp.core 3.1을 사용하기 시작하면 json에 사용할 라이브러리를 결정해야 합니다.HTH

ID 속성을 [System]으로 표시하여 이 문제를 해결했습니다.런타임시리얼화JsonProperty가 아닌 DataMember(Name="_id"])입니다.왜 원래 효과가 없었는지는 아직 확실히 알 수 없지만...

★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★.record 활자, 즉 를 사용해야 '를 .property:다음 질문에서 설명한 필드 접두사:

public record Person
(
  [property:JsonPropertyName("name")]
  string Name,
);

Json Property 태그가 무시되고 있는 것도 발견했습니다.결국 뉴턴소프트 Json을 로드하는 데 소리 없는 실패가 원인이라는 것을 알게 되었습니다.낸시 씨리얼라이제이션이요JsonNet은 Newtonsoft Json 9.0.0을 로드하려고 합니다.이것은, 인스톨 한 것보다 전의 버전입니다.에러는 발생하지 않고, 시리얼 라이저는 낸시에 의해서 제공되고 있습니다.시리얼화JsonNet을 사용할 수 없습니다.애플리케이션 구성에 라이브러리 매핑을 추가하면 다음 문제가 해결되었습니다.

<configuration>
    <runtime>
        <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
            <dependentAssembly>
                <assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" culture="neutral" />
                <bindingRedirect oldVersion="0.0.0.0-12.0.0.0" newVersion="12.0.0.0" />
            </dependentAssembly>
        </assemblyBinding>
    </runtime>
</configuration>

이는 메인 메서드 내에서 JsonNetSerializer를 조기에 로드하려고 시도함으로써 발견되었습니다.

Type t=typeof(JsonNetSerializer);

이로 인해 로드 오류가 발생하여 구성 해결로 이어졌습니다.

언급URL : https://stackoverflow.com/questions/8424151/json-net-serializer-ignoring-jsonproperty