.net core 3.에서 newtonsoft 코드를 System.Text.Json으로 변환 3. JObject.Parse 및 JsonProperty에 해당


12

newtonsoft 구현을 .net core 3.0의 새로운 JSON 라이브러리로 변환하고 있습니다. 다음 코드가 있습니다

public static bool IsValidJson(string json)
{
    try
    {                
        JObject.Parse(json);
        return true;
    }
    catch (Exception ex)
    {
        Logger.ErrorFormat("Invalid Json Received {0}", json);
        Logger.Fatal(ex.Message);
        return false;
    }
}

에 해당하는 것을 찾을 수 없습니다 JObject.Parse(json);

또한 JsonProperty동등한 속성은 무엇입니까?

public class ResponseJson
{
    [JsonProperty(PropertyName = "status")]
    public bool Status { get; set; }
    [JsonProperty(PropertyName = "message")]
    public string Message { get; set; }
    [JsonProperty(PropertyName = "Log_id")]
    public string LogId { get; set; }
    [JsonProperty(PropertyName = "Log_status")]
    public string LogStatus { get; set; }

    public string FailureReason { get; set; }
}

한 가지 더 내가 찾을 것입니다 Formating.None.


내가 이해 한 것은 간단한 수준의 json에 대한 것입니다. 정말 간단합니다. 중첩 된 json, 시간 형식, 기본값, 사전 직접 json 작성 등을 사용하는 경우 변환 전후 결과를 비교하기 위해 적절한 단위 테스트를 수행해야합니다.
Kamran Shahid

답변:


15

여기에 몇 가지 질문이 있습니다.

  1. 에 해당하는 것을 찾을 수 없습니다 JObject.Parse(json);

    로 시작하는 모든 JSON JsonDocument구문 분석 하고 검사하는 데 사용할 수 있습니다 RootElement. 루트 요소는 JsonElement모든 JSON 값을 나타내는 유형 이며 (primitive 또는 not) Newtonsoft 's에 해당합니다 JToken.

    그러나이 문서의 참고 걸릴 않는 말을 :

    이 클래스는 풀링 된 메모리의 자원을 활용하여 사용량이 많은 시나리오에서 가비지 콜렉터 (GC)의 영향을 최소화합니다. 이 객체를 올바르게 폐기하지 않으면 메모리가 풀로 반환되지 않아 프레임 워크의 다양한 부분에서 GC 영향이 증가합니다.

    JsonElement문서의 수명을 벗어나서 사용해야하는 경우 다음을 복제 해야 합니다.

    JsonElement원본의 수명을 넘어 안전하게 저장할 수 있는 을 가져 옵니다 JsonDocument.

    또한 JsonDocument현재 읽기 전용 이며 JSON 작성 또는 수정을위한 API를 제공하지 않습니다. 공개 된 문제 # 39922 : 쓰기 가능한 Json DOM 이이를 추적합니다.

    사용 예는 다음과 같습니다.

    //https://docs.microsoft.com/en-us/dotnet/csharp/whats-new/csharp-8#using-declarations 
    using var doc = JsonDocument.Parse(json);
    
    //Print the property names.
    var names = doc.RootElement.EnumerateObject().Select(p => p.Name);
    Console.WriteLine("Property names: {0}", string.Join(",", names)); // Property names: status,message,Log_id,Log_status,FailureReason
    
    //Re-serialize with indentation.
    using var ms = new MemoryStream();
    using (var writer = new Utf8JsonWriter(ms, new JsonWriterOptions { Indented = true }))
    {
        doc.WriteTo(writer);
    }
    var json2 = Encoding.UTF8.GetString(ms.GetBuffer(), 0, checked((int)ms.Length));
    
    Console.WriteLine(json2);
  2. 또한 JsonProperty동등한 속성은 무엇 입니까?

    제어 할 수있는 속성 JsonSerializerSystem.Text.Json.Serialization네임 스페이스에 배치되고 추상 기본 클래스에서 상속됩니다 JsonAttribute. 와 달리 JsonProperty속성 직렬화의 모든 측면을 제어 할 수있는 옴니버스 속성은 없습니다. 대신 특정 측면을 제어하는 ​​특정 속성이 있습니다.

    .NET Core 3부터 다음이 포함됩니다.

    • [JsonPropertyNameAttribute(string)]:

      직렬화 및 역 직렬화시 JSON에 존재하는 특성 이름을 지정합니다. 이는로 지정된 이름 지정 정책보다 우선합니다 JsonNamingPolicy.

      이것은 ResponseJson클래스 의 직렬화 된 이름을 제어하는 ​​데 사용하려는 속성입니다 .

      public class ResponseJson
      {
          [JsonPropertyName("status")]
          public bool Status { get; set; }
          [JsonPropertyName("message")]
          public string Message { get; set; }
          [JsonPropertyName("Log_id")]
          public string LogId { get; set; }
          [JsonPropertyName("Log_status")]
          public string LogStatus { get; set; }
      
          public string FailureReason { get; set; }
      }
    • [JsonConverterAttribute(Type)]:

      유형에 배치 할 때 호환 가능한 변환기가 JsonSerializerOptions.Converters콜렉션에 추가 되거나 JsonConverterAttribute동일한 유형의 특성에 다른 변환기가없는 경우 지정된 변환기가 사용됩니다 .

      참고 그 변환기의 설명 우선 순위 - 속성에 대한 속성 다음 옵션의 컨버터 모음 입력에 그 속성 -위한 기록 순서와 다르다 Newtonsoft 컨버터 이다 이어서, JsonConverter 구성원에 속성으로 정의 JsonConverter 클래스의 속성에 의해 정의되고 마지막으로 모든 변환기가 JsonSerializer로 전달됩니다.

    • [JsonExtensionDataAttribute]-Newtonsoft의에 해당합니다 [JsonExtensionData].

    • [JsonIgnoreAttribute]-Newtonsoft의에 해당합니다 [JsonIgnore].

  3. 를 통해 JSON을 작성할 때 또는 Utf8JsonWriter로 설정 JsonWriterOptions.Indented하여 들여 쓰기를 제어 할 수 있습니다 .truefalse

    을 통해 JSON으로 직렬화 할 때 또는 JsonSerializer.Serialize로 설정 JsonSerializerOptions.WriteIndented하여 들여 쓰기를 제어 할 수 있습니다 .truefalse

여기에서 직렬화 JsonSerializer및 구문 분석을 보여주는 데모 바이올린 JsonDocument.


@dbc 감사합니다. JsonDocument.Parse가 JObject에 대해 작동하고 다른 것은 JsonPropertyName처럼 작동합니다. 내일 내 응용 프로그램을 변환하고 확인합니다. 감사합니다
Kamran Shahid

감사합니다 @dbc
Kamran Shahid

2

이 링크는 아래에서 복사 한 스 니펫으로 이동해야합니다.

https://devblogs.microsoft.com/dotnet/try-the-new-system-text-json-apis/

WeatherForecast Deserialize(string json) { var options = new JsonSerializerOptions { AllowTrailingCommas = true }; return JsonSerializer.Parse<WeatherForecast>(json, options); } class WeatherForecast { public DateTimeOffset Date { get; set; } // Always in Celsius. [JsonPropertyName("temp")] public int TemperatureC { get; set; } public string Summary { get; set; } // Don't serialize this property. [JsonIgnore] public bool IsHot => TemperatureC >= 30; }


-1

다른 패키지 설치와 동일한 버전을 사용할 수 있습니다

  Install-Package Microsoft.AspNetCore.Mvc.NewtonsoftJson 

그때

services.AddControllers().AddNewtonsoftJson();

이것이 무엇을 의미합니까? 질문은 System.Text.json
Kamran Shahid
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.