나는 정보로 작업 할 수 있도록 http 웹 응답을 배열 또는 무언가로 구문 분석하려고합니다. 이것은 내가 얻는 json 응답입니다 (+ 훨씬 더 많지만 형식을 검열했습니다).
{
"meta": {
"status": 200
},
"data": {
"account": {
"account_phone_number": "XXXXXXXX",
"account_email": "[email protected]"
},
"user": {
"id": "5f2b17e7836fc7010025aed3",
"age": 23,
}
}
}
콘솔이나 텍스트 상자에 "사용자"내부의 "ID"를 어떻게 쓸 수 있습니까?
이것은 내 웹 요청입니다.
private void button1_Click(object sender, EventArgs e)
{
const string WEBSERVICE_URL = "url_here";
try
{
var webRequest = System.Net.WebRequest.Create(WEBSERVICE_URL);
if (webRequest != null)
{
webRequest.Method = "GET";
webRequest.Timeout = 12000;
webRequest.ContentType = "application/json";
webRequest.Headers.Add("x-auth-token", "Auth_token");
using (System.IO.Stream s = webRequest.GetResponse().GetResponseStream())
{
using (System.IO.StreamReader sr = new System.IO.StreamReader(s))
{
var jsonResponse = sr.ReadToEnd();
richTextBox1.AppendText(jsonResponse);
}
}
}
}
catch (Exception ex)
{
richTextBox1.AppendText("No workie");
}
}
나는 다음을 시도했다 :
public class Test
{
public string meta {get;set;}
public string data {get;set;}
}
다음과 같이 json을 테이블로 직렬화하려고 시도합니다.
JavaScriptSerializer js = new JavaScriptSerializer();
Test[] Tester = js.Deserialize<Test[]>(jsonResponse);
richTextBox1.AppendText(Tester);
하지만 운이 없습니다. 누구든지 여기에서 올바른 방향으로 나를 가리킬 수 있습니까?
다른 serializer를 사용할 수있는 경우 JavaScriptSerializer
부분 직렬화 해제를 활용할 수 있습니다.
의 경우 Json.NET (이전 Newtonsoft JSON라고도 함)는 적어도 두 가지 옵션이 있습니다 :
SelectToken
JObject semiParsedData = JObject.Parse(jsonResponse);
string id = (string)semiParsedData.SelectToken("data.user.id");
int age = (int)semiaParsedData.SelectToken("data.user.age");
string email = (string)semiParsedData.SelectToken("data.account.account_email");
Parse
메서드 를 호출하면 세미 파싱 된 개체가 생성됩니다.SelectToken
를 반환합니다 JToken
. 여기에서 여러 가지 방법으로 데이터를 검색 할 수 있습니다.
(string)semiParsedData.SelectToken("data.user.id")
semiParsedData.SelectToken("data.user.id").Value<string>()
semiParsedData.SelectToken("data.user.id").ToObject<string>()
참조 :
indexer operator
JObject semiParsedData = JObject.Parse(jsonResponse);
JToken data = semiParsedData["data"];
JToken user = data["user"];
string id = (string)user["id"];
int age = (int)user["age"];
JToken account = data["account"];
string email = (string)account["account_email"];
JToken
실제로 유용하지 않은 다음 인덱서 연산자를 정의합니다.public virtual JToken? this[object key]
{
get => throw new InvalidOperationException("Cannot access child value on {0}.".FormatWith(CultureInfo.InvariantCulture, GetType()));
set => throw new InvalidOperationException("Cannot set child value on {0}.".FormatWith(CultureInfo.InvariantCulture, GetType()));
}
JObject
는이 기능을 유용하게 만들기 위해이를 재정의합니다.
JObject
에서 파생되고 JContainer
에서 파생 됨 JToken
).public JToken? this[string propertyName]
{
get
{
ValidationUtils.ArgumentNotNull(propertyName, nameof(propertyName));
JProperty? property = Property(propertyName, StringComparison.Ordinal);
return property?.Value;
}
set
{
JProperty? property = Property(propertyName, StringComparison.Ordinal);
if (property != null)
{
property.Value = value!;
}
else
{
#if HAVE_INOTIFY_PROPERTY_CHANGING
OnPropertyChanging(propertyName);
#endif
Add(propertyName, value);
OnPropertyChanged(propertyName);
}
}
}
Property
메서드는 _properties
컬렉션 에서 요청 된 엔터티를 가져 오려고합니다 .
private readonly JPropertyKeyedCollection _properties
참고:
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다