에의 JSON의 시리얼화를 해제하고 있습니다.Newtonsoft를 사용하는 NET 객체(혹은 LINQ에서 JSON으로)
뉴턴소프트에 대한 글이 몇 개 있다는 걸 알고 있습니다. 그러니 꼭 반복이 아니길 바랍니다.Kazaa 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 라인은 최근에 시도했던 라인인데...이해가 잘 안 돼서 발품을 좀 빼고 싶어서요.원래 사전이나 뭐 그런 걸로 변환하려고 했는데...몇 가지 값만 있으면 되니까 문서상으로는 Newtonsoft의 LINQ에서 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를 사용하여...Kazaa에서 JSON 데이터를 검색하여 URL을 추출하고 파일을 다운로드하여 7줄의 코드처럼 모두 실행할 수 있습니다!난 그것을 좋아해.
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"]);
}
C# 를 사용할 수 있습니다.dynamic
를 입력해 주세요.이 기술은 또한 마법의 끈에 의존하지 않기 때문에 재팩터링을 단순화합니다.
JSON
다음 JSON 문자열은 HTTP API 콜로부터의 단순한 응답으로 다음 두 가지 속성을 정의합니다.Id
그리고.Name
.
{"Id": 1, "Name": "biofractal"}
C#
사용하다JsonConvert.DeserializeObject<dynamic>()
이 문자열을 동적 유형으로 역직렬화한 후 일반적인 방법으로 해당 속성에 액세스합니다.
dynamic results = JsonConvert.DeserializeObject<dynamic>(json);
var id = results.Id;
var name= results.Name;
의 타입을 지정했을 경우results
로서 변이하다.dynamic
를 사용하는 대신var
키워드를 지정하면 속성 값이 올바르게 역직렬화됩니다.Id
에 대해서int
이 아니라JValue
(아래 코멘트를 주신 GFolly83에 감사드립니다.
주의: Newtonsoft 어셈블리의 NuGet 링크는 http://nuget.org/packages/newtonsoft.json 입니다.
패키지:nuget 라이브 설치 프로그램을 사용하여 패키지를 추가할 수도 있습니다.프로젝트를 연 상태에서 브라우즈 패키지를 열고 설치, 언인스톨, 업데이트만 하면 의존관계/NuGet에서 프로젝트에 추가됩니다.
JSON 오브젝트에서 몇 가지 아이템만 가져오면 JSON을 사용할 수 있습니다.NET의 LINQ에서 JSON으로JObject
class. §:
JToken token = JObject.Parse(stringFullOfJson);
int page = (int)token.SelectToken("page");
int totalPages = (int)token.SelectToken("total_pages");
JSON 오브젝트를 완전히 역직렬화할 필요가 없기 때문에 이 접근방식이 마음에 듭니다.이것은 Twitter와 같은 오브젝트 속성 누락으로 깜짝 놀랄 수 있는 API에 도움이 됩니다.
문서:JSON과 JSON의 시리얼화 및 시리얼화 해제NET 및 LINQ에서 JSON으로(JSON에서)네트워크
★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;
}
나처럼 강한 타입의 오브젝트를 취급하고 싶은 경우는, 다음과 같이 합니다.**
MyObj obj = JsonConvert.DeserializeObject<MyObj>(jsonString);
이렇게 하면 인텔리센스를 사용하여 시간 유형 오류 검사를 컴파일할 수 있습니다.
JSON을 메모리에 복사하여 JSON 개체로 붙여넣으면(Visual Studio -> Edit -> Paste Special -> Paste JSON as Classes) 필요한 개체를 쉽게 만들 수 있습니다.
Visual Studio에 해당 옵션이 없는 경우 여기를 참조하십시오.
또한 JSON이 유효한지 확인해야 합니다.개체의 배열에 불과한 경우에는 처음에 자신의 개체를 추가합니다. 즉, {"obj:[{},{},{}]}
** 다이나믹이 때때로 상황을 더 쉽게 만들어준다는 것을 알지만, 저는 이 일에 좀 서툴러요.
제가 틀렸다면 정정해 주세요. 하지만 앞의 예는 제임스 뉴턴의 Json의 최신 버전과 약간 일치하지 않는 것 같습니다.NET 라이브러리
var o = JObject.Parse(stringFullOfJson);
var page = (int)o["page"];
var totalPages = (int)o["total_pages"];
Dynamic List Loose Typed - 역직렬화 및 값 읽기
// 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 오브젝트
또한 JSON 콘텐츠에 중첩된 특정 값을 찾고 있는 경우 다음과 같은 작업을 수행할 수 있습니다.
yourJObject.GetValue("jsonObjectName").Value<string>("jsonPropertyName");
그리고 거기서부터.
이는 JSON 전체를 C# 객체로 변환하는 비용을 부담하지 않는 경우에 도움이 됩니다.
extion 클래스를 json용으로 설정했습니다.
public static class JsonExtentions
{
public static string SerializeToJson(this object SourceObject) { return Newtonsoft.Json.JsonConvert.SerializeObject(SourceObject); }
public static T JsonToObject<T>(this string JsonString) { return (T)Newtonsoft.Json.JsonConvert.DeserializeObject<T>(JsonString); }
}
디자인 패턴:
public class Myobject
{
public Myobject(){}
public string prop1 { get; set; }
public static Myobject GetObject(string JsonString){return JsonExtentions.JsonToObject<Myobject>(JsonString);}
public string ToJson(string JsonString){return JsonExtentions.SerializeToJson(this);}
}
사용방법:
Myobject dd= Myobject.GetObject(jsonstring);
Console.WriteLine(dd.prop1);
이 파티에는 꽤 늦었지만, 오늘 회사에서 이 문제를 직접 접했습니다.제가 문제를 해결한 방법은 이렇습니다.
서드파티 API에 접속하여 도서목록을 검색하였습니다.오브젝트는 대략 20개 이상의 필드를 포함하는 대규모 JSON 오브젝트를 반환했습니다.이 오브젝트의 ID는 List 문자열 오브젝트로만 필요했습니다.동적 객체에서 linq를 사용하여 필요한 특정 필드를 검색한 후 List 문자열 객체에 삽입했습니다.
dynamic content = JsonConvert.DeserializeObject(requestContent);
var contentCodes = ((IEnumerable<dynamic>)content).Where(p => p._id != null).Select(p=>p._id).ToList();
List<string> codes = new List<string>();
foreach (var code in contentCodes)
{
codes.Add(code?.ToString());
}
마지막으로 JSON에서 상태 이름 가져오기
감사해요!
Imports System
Imports System.Text
Imports System.IO
Imports System.Net
Imports Newtonsoft.Json
Imports Newtonsoft.Json.Linq
Imports System.collections.generic
Public Module Module1
Public Sub Main()
Dim url As String = "http://maps.google.com/maps/api/geocode/json&address=attur+salem&sensor=false"
Dim request As WebRequest = WebRequest.Create(url)
dim response As WebResponse = DirectCast(request.GetResponse(), HttpWebResponse)
dim reader As New StreamReader(response.GetResponseStream(), Encoding.UTF8)
Dim dataString As String = reader.ReadToEnd()
Dim getResponse As JObject = JObject.Parse(dataString)
Dim dictObj As Dictionary(Of String, Object) = getResponse.ToObject(Of Dictionary(Of String, Object))()
'Get State Name
Console.WriteLine(CStr(dictObj("results")(0)("address_components")(2)("long_name")))
End Sub
End Module
JsonConvert를 사용한 역직렬화.Diserialize Object() 함수
public class ApiValues
{
[JsonProperty("Address")]
public string Address { get; set; }
[JsonProperty("BaseUrl")]
public string BaseUrl{ get; set; }
}
var json =
{
"Address":"some-address",
"BaseUrl":"some-url-value"
}
var values = JsonConvert.DeserializeObject<ApiValues>(json);
언급URL : https://stackoverflow.com/questions/4749639/deserializing-json-to-net-object-using-newtonsoft-or-linq-to-json-maybe
'itsource' 카테고리의 다른 글
Ajax 요청에 대한 전체 페이지 업데이트 (0) | 2023.02.14 |
---|---|
각 $http 서비스에서는 오류 상태를 파악하려면 어떻게 해야 합니까? (0) | 2023.02.14 |
웹 서버에서 브라우저로 데이터를 푸시할 수 있는 방법이 있습니까? (0) | 2023.02.14 |
워드프레스, 하위 페이지에 더 많은 게시물 표시 (0) | 2023.02.14 |
Eslint 오류 - 화살표 본문을 둘러싼 예기치 않은 블록 문입니다. 반환된 값을 = 바로 다음에 이동합니다.> (0) | 2023.02.14 |