>

정적 메소드가 포함 된 다음 클래스가 있습니다.

public static class RouteSerializer
{
    public static string SerializeRouteInformation(string content)
    {
        RouteMapModel routeMapModel = new RouteMapModel();
        List<RouteMapModel.end_location> endLocationList = new List<RouteMapModel.end_location>();
        var obj = JObject.Parse(content);
        string objRoutes = obj["routes"].ToString();
        JArray routeArray = JArray.Parse(objRoutes);
        JArray legArray = new JArray();
        foreach (JObject item in routeArray)
        {
            string leg = item.GetValue("legs").ToString();                
            legArray.Add(leg);
        }
        JArray stepArray = new JArray();
        foreach (JObject item in legArray)
        {
            string step = item.GetValue("steps").ToString();
            stepArray.Add(step);
        }
        foreach(JObject item in stepArray)
        {
            string endLocation = item.GetValue("end_location").ToString();
            var serializedEndLocation = JsonConvert.DeserializeObject<RouteMapModel.end_location>(endLocation);
            endLocationList.Add(serializedEndLocation);
        }
        //... goes on
    }
}

그러나 두 번째 foreach 의 구걸에 오류가 발생했습니다.  그것은 Newtonsoft.Json.Linq.JValue cannot be assigned to Newtonsoft.Json.Linq.JObject 로 . 그러나 문제는 후자의 foreach 에서 항목 유형을 JObject에서 JValue로 변경하면  조항, .GetValue() 에 도달 할 수 없습니다  JValue와 같은 메소드는 하나를 포함시키지 않습니다.

아래는 내가 연주하는 JSON 문자열입니다.

   { "geocoded_waypoints" : [
      {
         "geocoder_status" : "OK",
         "place_id" : "ChIJ5cGzCGa4yhQRk-lsJUoyizk",
         "types" : [ "street_address" ]
      },
      {
         "geocoder_status" : "OK",
         "place_id" : "ChIJb5VnEF64yhQRCrgps2g77jc",
         "types" : [ "street_address" ]
      }
   ],
"routes" : [
      {
         "bounds" : {
            "northeast" : {
               "lat" : 40.990381,
               "lng" : 29.0282547
            },
            "southwest" : {
               "lat" : 40.9863897,
               "lng" : 29.0216118
            }
         },
         "copyrights" : "Harita verileri ©2019 Google",
         "legs" : [
            {
               "distance" : {
                  "text" : "0,9 km",
                  "value" : 894
               },
               "duration" : {
                  "text" : "11 dakika",
                  "value" : 655
               },
               "end_address" : "Caferağa Mahallesi, Tuğlacı Eminbey Cd. No:5, 34710 Kadıköy/İstanbul, Türkiye",
               "end_location" : {
                  "lat" : 40.9863897,
                  "lng" : 29.0218105
               },
               "start_address" : "Osmanağa Mahallesi, Serasker Cd. No:118, 34714 Kadıköy/İstanbul, Türkiye",
               "start_location" : {
                  "lat" : 40.9893375,
                  "lng" : 29.028225
               },
               "steps" : [
                  {
                     "distance" : {
                        "text" : "8 m",
                        "value" : 8
                     },
                     "duration" : {
                        "text" : "1 dakika",
                        "value" : 5
                     },
                     "end_location" : {
                        "lat" : 40.9894537,
                        "lng" : 29.0282117
                     },
                     "html_instructions" : "\u003cb\u003eZiya Bey Sk.\u003c/b\u003e adlı yerden \u003cb\u003eSerasker Cd.\u003c/b\u003e hedefine \u003cb\u003ekuzey\u003c/b\u003e yönünde ilerleyin",
                     "polyline" : {
                        "points" : "kvdyFkqdpDGCMA?F"
                     },
                     "start_location" : {
                        "lat" : 40.9893375,
                        "lng" : 29.028225
                     },
                     "travel_mode" : "WALKING"
                  },
                  {
                     "distance" : {
                        "text" : "0,3 km",
                        "value" : 326
                     },
                     "duration" : {
                        "text" : "4 dakika",
                        "value" : 215
                     },
                     "end_location" : {
                        "lat" : 40.990381,
                        "lng" : 29.024582
                     },
                     "html_instructions" : "\u003cb\u003eSerasker Cd.\u003c/b\u003e yönünde \u003cb\u003esola\u003c/b\u003e dönün",
                     "maneuver" : "turn-left",
                     "polyline" : {
                        "points" : "awdyFiqdpDMxAKr@OjACP[vCEPC^Cf@CLAHENMZ@LQf@Qd@KZENSj@"
                     },
                     "start_location" : {
                        "lat" : 40.9894537,
                        "lng" : 29.0282117
                     },
                     "travel_mode" : "WALKING"
                  },
                  {
                     "distance" : {
                        "text" : "34 m",
                        "value" : 34
                     },
                     "duration" : {
                        "text" : "1 dakika",
                        "value" : 25
                     },
                     "end_location" : {
                        "lat" : 40.9901185,
                        "lng" : 29.0243691
                     },
                     "html_instructions" : "\u003cb\u003eMühürdar Cd.\u003c/b\u003e yönünde \u003cb\u003esola\u003c/b\u003e dönün",
                     "maneuver" : "turn-left",
                     "polyline" : {
                        "points" : "{|dyFszcpDHFHF^X"
                     },
                     "start_location" : {
                        "lat" : 40.990381,
                        "lng" : 29.024582
                     },
                     "travel_mode" : "WALKING"
                  },
                  {
                     "distance" : {
                        "text" : "8 m",
                        "value" : 8
                     },
                     "duration" : {
                        "text" : "1 dakika",
                        "value" : 5
                     },
                     "end_location" : {
                        "lat" : 40.990081,
                        "lng" : 29.0242851
                     },
                     "html_instructions" : "\u003cb\u003eMühürdar Cd.\u003c/b\u003e yönünde hafif \u003cb\u003esağa\u003c/b\u003e yönelin",
                     "maneuver" : "turn-slight-right",
                     "polyline" : {
                        "points" : "g{dyFiycpD?D?@?@@??@DB"
                     },
                     "start_location" : {
                        "lat" : 40.9901185,
                        "lng" : 29.0243691
                     },
                     "travel_mode" : "WALKING"
                  },
                  {
                     "distance" : {
                        "text" : "7 m",
                        "value" : 7
                     },
                     "duration" : {
                        "text" : "1 dakika",
                        "value" : 6
                     },
                     "end_location" : {
                        "lat" : 40.9900274,
                        "lng" : 29.0243112
                     },
                     "html_instructions" : "\u003cb\u003eMuvakkıthane Cd.\u003c/b\u003e konumunda \u003cb\u003esola\u003c/b\u003e dönün",
                     "maneuver" : "turn-left",
                     "polyline" : {
                        "points" : "_{dyFyxcpDDABA"
                     },
                     "start_location" : {
                        "lat" : 40.990081,
                        "lng" : 29.0242851
                     },
                     "travel_mode" : "WALKING"
                  },
                  {
                     "distance" : {
                        "text" : "0,4 km",
                        "value" : 352
                     },
                     "duration" : {
                        "text" : "4 dakika",
                        "value" : 259
                     },
                     "end_location" : {
                        "lat" : 40.987586,
                        "lng" : 29.0217648
                     },
                     "html_instructions" : "\u003cb\u003eMühürdar Cd.\u003c/b\u003e yönünde \u003cb\u003esağa\u003c/b\u003e dönün",
                     "maneuver" : "turn-right",
                     "polyline" : {
                        "points" : "uzdyF}xcpDhAz@pA|@pBtAHRJHRPPNPX\\d@BDHKfAlBDLDHDN@LBN"
                     },
                     "start_location" : {
                        "lat" : 40.9900274,
                        "lng" : 29.0243112
                     },
                     "travel_mode" : "WALKING"
                  },
                  {
                     "distance" : {
                        "text" : "63 m",
                        "value" : 63
                     },
                     "duration" : {
                        "text" : "1 dakika",
                        "value" : 51
                     },
                     "end_location" : {
                        "lat" : 40.987087,
                        "lng" : 29.0216118
                     },
                     "html_instructions" : "\u003cb\u003eMühürdar Cd.\u003c/b\u003e boyunca ilerlemek için \u003cb\u003esola\u003c/b\u003e dönün",
                     "maneuver" : "turn-left",
                     "polyline" : {
                        "points" : "mkdyF_icpDNBJ@J@TBJ?JADA@DDN"
                     },
                     "start_location" : {
                        "lat" : 40.987586,
                        "lng" : 29.0217648
                     },
                     "travel_mode" : "WALKING"
                  },
                  {
                     "distance" : {
                        "text" : "74 m",
                        "value" : 74
                     },
                     "duration" : {
                        "text" : "1 dakika",
                        "value" : 64
                     },
                     "end_location" : {
                        "lat" : 40.9864708,
                        "lng" : 29.0216118
                     },
                     "html_instructions" : "\u003cb\u003eMühürdar Cd.\u003c/b\u003e boyunca ilerlemek için \u003cb\u003esola\u003c/b\u003e dönün",
                     "maneuver" : "turn-left",
                     "polyline" : {
                        "points" : "ihdyFahcpDJEJAFALAH?VBj@F"
                     },
                     "start_location" : {
                        "lat" : 40.987087,
                        "lng" : 29.0216118
                     },
                     "travel_mode" : "WALKING"
                  },
                  {
                     "distance" : {
                        "text" : "22 m",
                        "value" : 22
                     },
                     "duration" : {
                        "text" : "1 dakika",
                        "value" : 25
                     },
                     "end_location" : {
                        "lat" : 40.9863897,
                        "lng" : 29.0218105
                     },
                     "html_instructions" : "\u003cb\u003eTuğlacı Eminbey Cd.\u003c/b\u003e yönünde \u003cb\u003esola\u003c/b\u003e dönün",
                     "maneuver" : "turn-left",
                     "polyline" : {
                        "points" : "mddyFahcpDNg@"
                     },
                     "start_location" : {
                        "lat" : 40.9864708,
                        "lng" : 29.0216118
                     },
                     "travel_mode" : "WALKING"
                  }
               ],
               "traffic_speed_entry" : [],
               "via_waypoint" : []
            }
         ],
         "overview_polyline" : {
            "points" : "kvdyFkqdpDUEM`B{@hHQfBGXMZ@Lc@lAQj@Sj@HFHF^X?D?B@@DBDABAhAz@bErCHRJHd@`@n@~@BDHKlAzBJXD\\ZD`@DVADA@DDNJERCVAbAJNg@"
         },
         "summary" : "Serasker Cd. ve Mühürdar Cd.",
         "warnings" : [
            "Yürüyerek gitmek için yol tarifi beta özelliğinde mevcuttur. Dikkat – Bu rotada kaldırım veya yaya yolu olmayabilir."
         ],
         "waypoint_order" : []
      }
   ],
   "status" : "OK"
}

서비스가 "legs" 를 제외한 거의 모든 속성을 사용하지 않기 때문에 전체 객체를 직렬화 해제하는 것을 선호하지 않습니다. "steps""end_location"   "steps" 의 내부 .


  • 답변 # 1

    문제는 코드가 JObject obj 의 선택된 부분을 쿼리한다는 것입니다.  계층은 JToken 에서 반복적으로 앞뒤로 변환  JSON 문자열 표현에 이르기까지, 그리고 어느 시점에서 JSON 문자열을재분석하지 않고 간단히문자열 리터럴으로 사용하면됩니다.

    특히 문제는 다음 코드에 있습니다.

    JArray legArray = new JArray();
    foreach (JObject item in routeArray)
    {
        string leg = item.GetValue("legs").ToString();
        legArray.Add(leg);
    }
    
    
    당신은 JArray.Add() 를 호출 그러나이 메소드에는 여러 개의 과부하가 있으므로 어느 것이 호출됩니까? string 의 내재 된 연산자가 있기 때문에   JToken 로 무슨 일이 일어나는가  문자열이 leg 로 변환됩니다.  암시 적 연산자를 사용하는 문자열 리터럴, JValue 에 추가됨 . 이후 JArray 에 추가 한 항목 때문에 다음 코드는 잘못된 캐스트 예외로 실패합니다.   legArray 유형입니다   JValue 가 아님 :

    JObject
    
    

    솔루션은 코드를 단순화하고 foreach (JObject item in legArray) { 간에 전환하는 것을 완전히 피하는 것입니다.  그리고 string  표현. 다음 코드는 트릭을 수행합니다.

    JToken
    
    

    유형 사용

    var endLocationList = obj
        .SelectTokens("routes[*].legs[*].steps[*].end_location")
        .Select(t => t.ToObject<Location>())
        .ToList();
    
    

    참고 사항 :

    public class Location { public double Lat { get; set; } public double Lng { get; set; } } 에서 직접 직렬화 해제 할 수 있습니다   JToken 를 사용하여 POCO로 . 이것은 JToken.ToObject<T>() 를 포맷하는 것보다 간단하고 성능이 좋습니다.  문자열로 문자열을 역 직렬화합니다.

    JToken  JSONPath 구문을 사용하여 JSON 계층을 쿼리 할 수 ​​있습니다.

    여기 JToken.SelectTokens()  배열의 모든 항목, 특히 [*] 를 선택하는 와일드 카드를 나타냅니다. "routes"  그리고 "legs"  배열.

    자세한 내용은 # JSONPath-JSON 용 XPath를 참조하십시오.

    데모 바이올린 여기.

    "steps"

관련 자료

  • 이전 javascript - Vuex 계산 속성이 v-show를 업데이트하지 않습니다
  • 다음 concatenation - 엑셀 모양 안에 연결