[C#] Newtonsoft를 사용하여 JSON을 .NET 객체로 직렬화 해제 (또는 LINQ to JSON?)

Newtonsoft에 대한 몇 가지 게시물이 있다는 것을 알고 있기 때문에 이것이 반복되는 것은 아닙니다 … 카자 API에서 반환 된 JSON 데이터를 멋진 객체로 변환하려고합니다.

WebClient client = new WebClient();
Stream stream = client.OpenRead("http://api.kazaa.com/api/v1/search.json?q=muse&type=Album");
StreamReader reader = new StreamReader(stream);

List<string> list = Newtonsoft.Json.JsonConvert.DeserializeObject<List<string>>(reader.Read().ToString());

foreach (string item in list)
{
    Console.WriteLine(item);
}

//Console.WriteLine(reader.ReadLine());
stream.Close();

그 JsonConvert 라인은 내가 시도한 가장 최근의 것입니다 … 나는 그것을 얻지 못하고 당신에게 부탁하여 약간의 발걸음을 없애기를 바라고있었습니다. 원래 그것을 Dictionary 또는 무언가로 변환하려고 시도했습니다 … 실제로 문서에서 판단 할 때 몇 가지 값을 가져와야합니다 .Newtonsoft의 LINQ to JSON이 더 나은 선택 일 수 있습니까? 생각 / 링크?

다음은 JSON 반환 데이터의 예입니다.

{
  "page": 1,
  "total_pages": 8,
  "total_entries": 74,
  "q": "muse",
  "albums": [
    {
      "name": "Muse",
      "permalink": "Muse",
      "cover_image_url": "http://image.kazaa.com/images/69/01672812 1569/Yaron_Herman_Trio/Muse/Yaron_Herman_Trio-Muse_1.jpg",
      "id": 93098,
      "artist_name": "Yaron Herman Trio"
    },
    {
      "name": "Muse",
      "permalink": "Muse",
      "cover_image_url": "htt p://image.kazaa.com/images/54/888880301154/Candy_Lo/Muse/Candy_Lo-Muse_1.jpg",
      "i d": 102702,
      "artist_name": "\u76e7\u5de7\u97f3"
    },
    {
      "name": "Absolution",
      "permalink": " Absolution",
      "cover_image_url": "http://image.kazaa.com/images/65/093624873365/Mus e/Absolution/Muse-Absolution_1.jpg",
      "id": 48896,
      "artist_name": "Muse"
    },
    {
      "name": "Ab solution",
      "permalink": "Absolution-2",
      "cover_image_url": "http://image.kazaa.com/i mages/20/825646911820/Muse/Absolution/Muse-Absolution_1.jpg",
      "id": 118573,
      "artist _name": "Muse"
    },
    {
      "name": "Black Holes And Revelations",
      "permalink": "Black-Holes-An d-Revelations",
      "cover_image_url": "http://image.kazaa.com/images/66/093624428466/ Muse/Black_Holes_And_Revelations/Muse-Black_Holes_And_Revelations_1.jpg",
      "id": 48813,
      "artist_name": "Muse"
    },
    {
      "name": "Black Holes And Revelations",
      "permalink": "Bla ck-Holes-And-Revelations-2",
      "cover_image_url": "http://image.kazaa.com/images/86/ 825646911486/Muse/Black_Holes_And_Revelations/Muse-Black_Holes_And_Revelations_1 .jpg",
      "id": 118543,
      "artist_name": "Muse"
    },
    {
      "name": "Origin Of Symmetry",
      "permalink": "Origin-Of-Symmetry",
      "cover_image_url": "http://image.kazaa.com/images/29/825646 912629/Muse/Origin_Of_Symmetry/Muse-Origin_Of_Symmetry_1.jpg",
      "id": 120491,
      "artis t_name": "Muse"
    },
    {
      "name": "Showbiz",
      "permalink": "Showbiz",
      "cover_image_url": "http: //image.kazaa.com/images/68/825646182268/Muse/Showbiz/Muse-Showbiz_1.jpg",
      "id": 60444,
      "artist_name": "Muse"
    },
    {
      "name": "Showbiz",
      "permalink": "Showbiz-2",
      "cover_imag e_url": "http://image.kazaa.com/images/50/825646912650/Muse/Showbiz/Muse-Showbiz_ 1.jpg",
      "id": 118545,
      "artist_name": "Muse"
    },
    {
      "name": "The Resistance",
      "permalink": "T he-Resistance",
      "cover_image_url": "http://image.kazaa.com/images/36/825646864836/ Muse/The_Resistance/Muse-The_Resistance_1.jpg",
      "id": 121171,
      "artist_name": "Muse"
    }
  ],
  "per_page": 10
}

나는 더 많은 독서를했고 Newtonsoft의 LINQ to JSON은 WebClient, Stream, StreamReader 및 Newtonsoft를 사용하여 정확히 내가 원하는 것임을 발견했습니다 .JSON 데이터를 위해 Kazaa를 누르고 URL을 추출하고 파일을 다운로드하여 수행 할 수 있습니다 모두 일곱 줄의 코드처럼! 나는 그것을 좋아한다.

WebClient client = new WebClient();
Stream stream = client.OpenRead("http://api.kazaa.com/api/v1/search.json?q=muse&type=Album");
StreamReader reader = new StreamReader(stream);

Newtonsoft.Json.Linq.JObject jObject = Newtonsoft.Json.Linq.JObject.Parse(reader.ReadLine());

// Instead of WriteLine, 2 or 3 lines of code here using WebClient to download the file
Console.WriteLine((string)jObject["albums"][0]["cover_image_url"]);
stream.Close();

이 게시물은 너무 많은 인기를 얻었습니다. 의견에서 논의 된 “사용”비트를 포함하는 것이 도움이 될 것이라고 생각했습니다.

using(var client = new WebClient())
using(var stream = client.OpenRead("http://api.kazaa.com/api/v1/search.json?q=muse&type=Album"))
using (var reader = new StreamReader(stream))
{
    var jObject = Newtonsoft.Json.Linq.JObject.Parse(reader.ReadLine());
    Console.WriteLine((string) jObject["albums"][0]["cover_image_url"]);
}



답변

JSON 객체에서 몇 가지 항목을 가져와야 할 경우 Json.NET의 LINQ to JSON JObject클래스를 사용합니다. 예를 들면 다음과 같습니다.

JToken token = JObject.Parse(stringFullOfJson);

int page = (int)token.SelectToken("page");
int totalPages = (int)token.SelectToken("total_pages");

JSON 객체를 완전히 직렬화 해제 할 필요가 없기 때문에이 방법이 마음에 듭니다. 이것은 트위터와 같은 객체 속성이 누락되어 놀라게 할 수있는 API에 유용합니다.

설명서 : Json.NETLINQ를 사용하여 JSON을 Json.NET을 사용하여 JSON으로 직렬화 및 역 직렬화


답변

C #을 사용할 수 있습니다 dynamic 형식을 사용하면 작업을보다 쉽게 ​​수행 할 수 있습니다. 이 기술은 또한 마술 문자열에 의존하지 않기 때문에 리팩토링을 더 단순하게 만듭니다.

JSON

아래의 JSON 문자열은 HTTP API 호출에서 간단한 반응이며, 그것은 두 가지 속성을 정의 Id하고 Name.

{"Id": 1, "Name": "biofractal"}

씨#

JsonConvert.DeserializeObject<dynamic>()이 문자열을 동적 유형으로 직렬화 해제 한 다음 일반적인 방식으로 해당 특성에 간단히 액세스하는 데 사용하십시오 .

dynamic results = JsonConvert.DeserializeObject<dynamic>(json);
var id = results.Id;
var name= results.Name;

당신의 유형을 지정하는 경우 results변수로 dynamic대신 사용하는 var키워드를, 다음 속성 값이 제대로 예를 들면, 역 직렬화됩니다 Idint아닌JValue (주석 아래에 대한 GFoley83 덕분에).

참고 : Newtonsoft 어셈블리의 NuGet 링크는 http://nuget.org/packages/newtonsoft.json입니다. 입니다.

패키지 : nuget live 설치 프로그램으로 패키지를 추가 할 수도 있습니다. 프로젝트를 열면 패키지를 찾아 설치 한 다음 unistall, update 설치하면 종속성 / NuGet에서 프로젝트에 추가됩니다.


답변

dynamic키워드를 사용하면 이런 종류의 객체를 파싱하기가 정말 쉬워집니다.

dynamic x = Newtonsoft.Json.JsonConvert.DeserializeObject(jsonString);
var page = x.page;
var total_pages = x.total_pages
var albums = x.albums;
foreach(var album in albums)
{
    var albumName = album.name;

    // Access album data;
}


답변

내가 틀렸다면 정정하십시오. 그러나 이전 예제는 최신 버전의 James Newton의 Json.NET 라이브러리와 약간 일치하지 않는다고 생각합니다.

var o = JObject.Parse(stringFullOfJson);
var page = (int)o["page"];
var totalPages = (int)o["total_pages"];


답변

나와 같이 강하게 유형이 지정된 객체를 다루는 것을 선호한다면 다음을 수행하십시오.

MyObj obj =  JsonConvert.DeserializeObject<MyObj>(jsonString);

이렇게하면 인텔리전스 및 컴파일 시간 유형 오류 검사를 사용할 수 있습니다.

JSON을 메모리에 복사하고 JSON 객체로 붙여 넣어 필요한 객체를 쉽게 만들 수 있습니다 (Visual Studio-> 편집-> 붙여 넣기 특수-> JSON을 클래스로 붙여 넣기).

여기를 참조 하십시오Visual Studio에 해당 옵션이없는 경우 .

또한 JSON이 유효한지 확인해야합니다. 객체 배열 일 경우 시작시 자신의 객체를 추가하십시오. 즉 { “obj”: [{}, {}, {}]}

** 나는 동적 이 때때로 일을 더 쉽게 만든다는 것을 알고 있지만 이것에 대해서는 약간의 문제가 있습니다.


답변

느슨하게 입력 된 동적 목록 -역 직렬화 및 값 읽기

// First serializing
dynamic collection = new { stud = stud_datatable }; // The stud_datable is the list or data table
string jsonString = JsonConvert.SerializeObject(collection);


// Second Deserializing
dynamic StudList = JsonConvert.DeserializeObject(jsonString);

var stud = StudList.stud;
foreach (var detail in stud)
{
    var Address = detail["stud_address"]; // Access Address data;
}


답변

나는이 방법을 좋아한다 :

using Newtonsoft.Json.Linq;
// jsonString is your JSON-formatted string
JObject jsonObj = JObject.Parse(jsonString);
Dictionary<string, object> dictObj = jsonObj.ToObject<Dictionary<string, object>>();

이제 dictObj사전으로 사용하여 원하는 모든 것에 액세스 할 수 있습니다 . Dictionary<string, string>값을 문자열로 얻는 것을 선호 하는 경우 에도 사용할 수 있습니다 .

이 동일한 방법을 사용하여 모든 종류의 .NET 객체로 캐스트 할 수 있습니다.