programing

JContainer, JObject, JToken 및 Linq 혼재

nicescript 2023. 2. 15. 22:59
반응형

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 ★★★★★★★★★★★★★★★★★」JObjectLINQ를 사용하다★★★★★★★★★★★★★★★의 목적은 무엇입니까?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

반응형