Json 결과가 객체인지 어레이인지 확인합니다.
.net web api를 사용하여 json을 가져와 angular를 위해 프런트 엔드로 되돌리고 있습니다.json은 개체 또는 배열일 수 있습니다.현재 내 코드는 오브젝트가 아닌 어레이에서만 작동합니다.내용이 객체인지 배열인지 tryparse할 방법을 찾아야 합니다.
여기 제 코드가 있습니다.
public HttpResponseMessage Get(string id)
{
string singleFilePath = String.Format("{0}/../Data/phones/{1}.json", AssemblyDirectory, id);
List<Phone> phones = new List<Phone>();
Phone phone = new Phone();
JsonSerializer serailizer = new JsonSerializer();
using (StreamReader json = File.OpenText(singleFilePath))
{
using (JsonTextReader reader = new JsonTextReader(json))
{
//if array do this
phones = serailizer.Deserialize<List<Phone>>(reader);
//if object do this
phone = serailizer.Deserialize<Phone>(reader);
}
}
HttpResponseMessage response = Request.CreateResponse<List<Phone>>(HttpStatusCode.OK, phones);
return response;
}
위의 방법은 최선의 방법이 아닐 수 있습니다.바로 지금 내가 있는 곳이야.
Json 사용.NET에서는, 다음과 같이 할 수 있습니다.
string content = File.ReadAllText(path);
var token = JToken.Parse(content);
if (token is JArray)
{
IEnumerable<Phone> phones = token.ToObject<List<Phone>>();
}
else if (token is JObject)
{
Phone phone = token.ToObject<Phone>();
}
저는 Json을 사용하여 수용된 솔루션을 발견했습니다.NET은 큰 JSON 파일에서는 약간 느립니다.
보아하니JToken
API가 너무 많은 메모리 할당을 수행하고 있습니다.
다음 그림은 다음 명령어를 사용하는 도우미 메서드입니다.JsonReader
동일한 결과를 가진 API:
public static List<T> DeserializeSingleOrList<T>(JsonReader jsonReader)
{
if (jsonReader.Read())
{
switch (jsonReader.TokenType)
{
case JsonToken.StartArray:
return new JsonSerializer().Deserialize<List<T>>(jsonReader);
case JsonToken.StartObject:
var instance = new JsonSerializer().Deserialize<T>(jsonReader);
return new List<T> { instance };
}
}
throw new InvalidOperationException("Unexpected JSON input");
}
사용방법:
public HttpResponseMessage Get(string id)
{
var filePath = $"{AssemblyDirectory}/../Data/phones/{id}.json";
using (var json = File.OpenText(filePath))
using (var reader = new JsonTextReader(json))
{
var phones = DeserializeSingleOrList<Phone>(reader);
return Request.CreateResponse<List<Phone>>(HttpStatusCode.OK, phones);
}
}
신기하게도 @dcastro의 대답이 더 좋다.단, JToken 객체를 생성하는 경우에는 토큰의 Type enum 속성만 사용할 수 있습니다.Type 속성이 이미 결정되었기 때문에 객체 유형을 비교하는 것보다 비용이 적게 들 수 있습니다.
https://www.newtonsoft.com/json/help/html/T_Newtonsoft_Json_Linq_JTokenType.htm
//...JToken token
if (token.Type == JTokenType.Array)
{
IEnumerable<Phone> phones = token.ToObject<List<Phone>>();
}
else if (token.Type == JTokenType.Object)
{
Phone phone = token.ToObject<Phone>();
}
else
{
Console.WriteLine($"Neither, it's actually a {token.Type}");
}
를 사용하고 있는 경우.NET Core 3.1 에서는, 다음의 체크를 사용할 수 있습니다.JsonElement
물건.
using System.Text.Json;
public void checkJsonElementType(JsonElement element) {
switch (element.ValueKind)
{
case JsonValueKind.Array:
// it's an array
// your code in case of array
break;
case JsonValueKind.Object:
// it's an object
// your code in case of object
break;
case JsonValueKind.String:
// it's an string
// your code in case of string
break;
.
.
.
}
}
허용되는 값JsonValueKind
이다Array, False, Null, Number, Object, String, True, Undefined
언급URL : https://stackoverflow.com/questions/20620381/determine-if-json-results-is-object-or-array
'IT' 카테고리의 다른 글
ORA-01843은 유효한 달이 아닙니다.비교일 (0) | 2023.02.10 |
---|---|
Oracle에서 테이블, 뷰 및 동의어에 대한 모든 인덱스와 해당 열을 찾는 방법 (0) | 2023.02.10 |
하나의 요청에 대한 HTTP 헤더 설정 (0) | 2023.02.10 |
함수에 외부 파일을 포함합니다.php WordPress (0) | 2023.02.10 |
Telem API와의 상호작용 방법 (0) | 2023.02.10 |