JContainer, JObject, JToken 및 Linq 혼재
언제 사용해야 할지 잘 모르겠어요.JContainer
,JObject
, , , , 입니다.JToken
으로부터 「표준」이라고 하는 것을 JObject
되어 있습니다.JProperties
그 리리 and and andJToken
기본 추상 클래스입니다.JToken
을 수 .JContainer
.
저는 C#을 사용하고 있고, 방금 LinqPad Pro 5를 구입했습니다.
파일에 JSON 데이터 소스가 있으므로 다음 문을 사용하여 파일 내용을 성공적으로 역직렬화합니다.
string json;
using (StreamReader reader = new StreamReader(@"myjsonfile.json"))
{
json = reader.ReadToEnd();
}
를 가져와 JSON으로 .JObject
내가 )jsonWork
a JToken
★★★★★★★★★★★★★★★★★」JContainer
JObject jsonWork = (JObject)JsonConvert.DeserializeObject(json);
JSON 데이터(JSON으로 표시되는 문자열)에는 다음과 유사한 최상위 개체가 세 개 있습니다.
{
"Object1" : { ... },
"Object2" : { ... },
"Object3" : { ... }
}
각 오브젝트는 모든 종류의 토큰(어레이, 문자열, 기타 오브젝트 등)으로 구성되어 있기 때문에 다이내믹 JSON입니다.(이 질문은 많은 JSON 데이터로 뒤죽박죽으로 하는 것이 아니라 줄임표를 플레이스 홀더로 사용했습니다.)
리리고싶싶 i를 "Object1"
,"Object2"
, , , , 입니다."Object3"
LINQ는 별도로 합니다.이상적으로는 다음과 같은 것이 좋습니다.
// these lines DO NOT work
var jsonObject1 = jsonWork.Children()["Object1"]
var jsonObject2 = jsonWork.Children()["Object2"]
var jsonObject3 = jsonWork.Children()["Object3"]
그러나 위의 행은 실패합니다.
하였습니다.var
에 위의 을 참조해 주십시오.JContainer
,JObject
, 「」JToken
싶은지 알 수 , 에 말한 , jsonObject#
변수가 적절하게 할당되어 있습니다. LINQ는 JSON을 사용합니다.다음으로 매우 간단한 예를 제시하겠습니다.
var query = from p in jsonObject1
where p.Name == "Name1"
select p
는 JSON 등을 jsonObject
를 사용하여 수 있을 것 같습니다LINQ의 JSON입니다.
다음 항목을 사용할 경우:
// this line WORKS
var jsonObject1 = ((JObject)jsonWork).["Object1"];
나서 나는 ...을 된다.JObject
를 치다jsonObject1
이것이 올바른 접근법입니까?
언제, 왜 사용하는지는 불분명합니다.JContainer
라고 될 때JToken
★★★★★★★★★★★★★★★★★」JObject
LINQ를 사용하다★★★★★★★★★★★★★★★의 목적은 무엇입니까?JContainer
됩니다.JContainer
대부분의 경우.이는 LINQ-to-JSON을 잘 구성된 코드로 구성하고 구성하는 데 도움이 됩니다.
계층은 다음과 같습니다.
JToken - abstract base class
JContainer - abstract base class of JTokens that can contain other JTokens
JArray - represents a JSON array (contains an ordered list of JTokens)
JObject - represents a JSON object (contains a collection of JProperties)
JProperty - represents a JSON property (a name/JToken pair inside a JObject)
JValue - represents a primitive JSON value (string, number, boolean, null)
a는 a, 즉 a입니다.
기본적인 경험칙은 다음과 같습니다.
- 괄호로 )가
{
★★★★★★★★★★★★★★★★★」}
(JSON의 경우) 사용 - 됨)
[
그리고.]
), 사용 - 기본값이 있다는 것을 알고 있다면
- 보유하고 있는 토큰의 종류를 모르거나 위의 몇 가지 사항을 일반적인 방법으로 처리할 수 있는 경우 를 사용하십시오.그 후, 그 정보를 확인할 수 있습니다.
Type
어떤 종류의 토큰인지 판단하고 적절히 주조하는 속성입니다.
JContainer
는 하위 항목이 있는 JSON 요소의 기본 클래스입니다. JObject
,JArray
,JProperty
그리고.JConstructor
모두 상속받습니다.
예를 들어 다음과 같은 코드가 있습니다.
(JObject)JsonConvert.DeserializeObject("[1, 2, 3]")
던질 수 있다InvalidCastException
단, 그것을 에 던지면JContainer
, 괜찮습니다.
처음의 질문에 대해서, JSON 오브젝트가 톱 레벨에 있는 것을 알고 있는 경우는, 다음과 같이 할 수 있습니다.
var jsonWork = JObject.Parse(json);
var jsonObject1 = jsonWork["Object1"];
대부분의 예에는 단순한 json이 있으며, 저는 "C# Newtonsoft parse JSON"을 여러 번 검색했습니다.
여기 csv를 해석해 달라는 요청을 받은 json 파일이 있습니다.회사 이름 값은 많은 어레이/개체 내에 중첩되어 있기 때문에 이 점에서 다소 복잡합니다.
{
"page": {
"page": 1,
"pageSize": 250
},
"dataRows": [
{
"columnValues": {
"companyName": [
{
"name": "My Awesome Company",
}
]
}
}
]
}
var jsonFilePath = @"C:\data.json";
var jsonStr = File.ReadAllText(jsonFilePath);
// JObject implementation for getting dataRows JArray - in this case I find it simpler and more readable to use a dynamic cast (below)
//JObject jsonObj = JsonConvert.DeserializeObject<JObject>(jsonStr);
//var dataRows = (JArray)jsonObj["dataRows"];
var dataRows = ((dynamic)JsonConvert.DeserializeObject(jsonStr)).dataRows;
var csvLines = new List<string>();
for (var i = 0; i < dataRows.Count; i++)
{
var name = dataRows[i]["columnValues"]["companyName"][0]["name"].ToString();
// dynamic casting implemntation to get name - in this case, using JObject indexing (above) seems easier
//var name2 = ((dynamic)((dynamic)((dynamic)dataRows[i]).columnValues).companyName[0]).name.ToString();
csvLines.Add(name);
}
File.WriteAllLines($@"C:\data_{DateTime.Now.Ticks}.csv", csvLines);
언급URL : https://stackoverflow.com/questions/38558844/jcontainer-jobject-jtoken-and-linq-confusion
'programing' 카테고리의 다른 글
워드프레스, 게시물 유형 목록 페이지에 사용자 지정 버튼 추가 (0) | 2023.02.15 |
---|---|
리액트 훅: useRef Hook에 대해 .current가 null인 이유는 무엇입니까? (0) | 2023.02.15 |
history.replaceState() 예? (0) | 2023.02.15 |
식에 의한 그룹이 아닌 ORA-00979 (0) | 2023.02.15 |
pymongo를 사용하여 mongodb에서 ObjectId로 검색 (0) | 2023.02.15 |