c\#간단 한 제 이 슨 해석 기 를 어떻게 실현 합 니까?

JSON
  • JSON(JavaScript Object Notation)은 경량급 데이터 교환 형식 이다.다른 데이터 교환 형식 XML 에 비해 JSON 은 많은 장점 을 가지 고 있다.예 를 들 어 가 독성 이 더 좋 고 공간 을 적 게 차지 하 는 등 이다.웹 애플 리 케 이 션 개발 분야 에서 JavaScript 가 JSON 에 좋 은 지원 을 해 준 덕분에 JSON 은 XML 보다 개발 자 들 에 게 더 인기 가 많다.그래서 개발 자로 서 관심 이 있다 면 JSON 과 관련 된 지식 을 깊이 있 게 알 아야 한다.JSON 의 원 리 를 탐구 하 는 목적 에 따라 저 는 이 글 에서 간단 한 JSON 해석 기의 해석 절차 와 실현 디 테 일 을 상세 하 게 소개 하 겠 습 니 다.JSON 자체 가 간단 하기 때문에 해석 도 복잡 하지 않다.그래서 여러분 이 관심 이 있다 면 본문 을 본 후에 직접 JSON 해석 기 를 실현 하 는 것 도 좋 습 니 다.자,다른 이 야 기 는 더 이상 하지 않 겠 습 니 다.이제 중점 장 으로 옮 깁 시다
  • 4.567917.4.567915.문자열 을 해석 할 때 이것 이 정확 한 JOSN 인지 아 닌 지 알 수 없다 면 이 위 에서 테스트 해 보 세 요.자신의 코드 에 대한 테스트 에 유리 합 니 다.
    2.해석 원리 소개
    분석 대상{}대상 구 조 는{"Key":[값]}의 형식 이 므 로 먼저 Key 문자열 로 해석 하고 Key 를 분석 한 다음 값 으로 해석 합 니 다.값 은[문자열,값 유형,불 유형,대상,배열,null]일 수 있 으 므 로 접두사 에 따라 유형 을 얻 고 해당 하 는 분석 방법 을 호출 하여"}"대상 의 끝 에 순환 적 으로 해석 해 야 합 니 다.
  • 분석 배열[]
  • 대상 의 구 조 는[[[값],[값]입 니 다.값 은[문자열,값 유형,불 유형,대상,배열,null]일 수 있 기 때문에 접두사 에 따라 유형 을 얻 고 해당 하 는 분석 방법 을 호출 하여]배열 의 끝 을 순환 적 으로 해석 해 야 합 니 다.
    해석 문자열
    반복 적 으로 해석 합 니 다.전의 자 를 만 났 는 지 여 부 를 판단 해 야 합 니 다.\만 났 을 때 현재 문자 의 다음 문 자 는 일반 문자 로 결 과 를 저장 합 니 다.전의 가 아 닌 문 자 를 만 났 을 때 문자열 읽 기 방법 을 종료 하고 결 과 를 되 돌려 줍 니 다.
    분석 치 유형
    순환 당 김[0-9]은'기호'를 포함 하고 double 형식 으로 변환 하 는 방법 을 호출 합 니 다.
    불 유형 분석
    true 인지 false 인지 판단 을 바 꿉 니 다.
    해석 nullnull 인지 아 닌 지 판단 하기
    분석 요소 흐름 도

    분석 방법 목록
    방법
    방법 작용
    AnalysisJson
    JSON 문자열 을 C\#데이터 구조 로 해석 합 니 다.
    AnalysisJsonObject
    JSON 문자열 을 대상 구조 로 해석
    AnalysisJsonArray
    JSON 문자열 을 배열 구조 로 해석 합 니 다.
    ReadElement
    JSON 구 조 를 읽 고 꺼 냅 니 다.
    ReadJsonNumber
    값 형식 구조 읽 기
    ReadJsonNull
    null 구조 읽 기
    ReadJsonFalse
    false 구조 읽 기
    ReadJsonTrue
    true 구 조 를 읽 고 꺼 냅 니 다.
    ReadString
    읽 기 문자열 구조
    ReadToNonBlankIndex
    비 공백 문자 아래 표 시 된 위치 로 읽 기
    JSON
    {"Name":"장삼","Age":18}
    1.첫 번 째 문자{JSON 대상 구 조 를 분석 하고 AnalysisJSonObject 방법 으로 JSON 대상 형식 을 분석 합 니 다.
    2.대상 을 분석 하 는 방법 은 키-Value 구 조 를}대상 의 꼬리 문자 까지 반복 적 으로 해석 하기 시작 합 니 다.
  • 먼저 Key 구 조 를 해석 하고 ReadString 을 호출 하여 Key 문자열 을 해석 하여 Name 이라는 값 을 얻 습 니 다
  • 그리고 Value 를 분석 합 니 다.값 이 임 의 구조 일 수 있 기 때문에 ReadElement 를 호출 하여 JSON 구 조 를 분석 합 니 다
  • 첫 번 째 문 자 를 읽 고"이 Value 가 문자열 이라는 것 을 알 수 있 습 니 다.호출 방법 ReadString 으로 이 Value 의 값 을 읽 습 니 다.3
  • 다음 문 자 를 읽 어 보 니 JSON 대상 이 아 닌 마지막 문자}예,문자 대표 아래 에 키-Value 구조 가 존재 합 니 다.계속 읽 습 니 다
  • 먼저 Key 구 조 를 해석 하고 ReadString 을 호출 하여 Key 문자열 을 해석 하여 Age 라 는 값 을 얻 습 니 다
  • 그리고 Value 를 분석 합 니 다.값 이 임 의 구조 일 수 있 기 때문에 ReadElement 를 호출 하여 JSON 구 조 를 분석 합 니 다
  • 첫 번 째 문 자 를 읽 어 보 니 1 이 숫자 인 것 을 발 견 했 습 니 다.아래 의 이 구 조 는 수치 유형 호출 방법 인 ReadJSonNumber 로 수치 유형 을 읽 습 니 다
  • 다음 문 자 를 읽 어 보 니}JSON 대상 의 끝 문자 입 니 다.JSON 대상 분석 을 종료 하고 분 석 된 JSON 대상 구조 인 스 턴 스 를 되 돌려 줍 니 다.
  • JSON
    [{"과목":"국어","성적":99}]
    1.첫 번 째 문 자 를 분석 합 니 다.[JSON 배열 구조 임 을 발 견 했 습 니 다.호출 방법 AnalysisJSonArray 방법 으로 JSON 배열 구 조 를 분석 합 니 다.
    JSON 데이터 구 조 를 만 날 때 까지 반복 적 으로 분석 합 니 다]배열 구조 끝 문자
    배열 의 모든 요 소 는 임의의 형식의 데이터 일 수 있 기 때문에 ReadElement 방법 으로 값 을 분석 합 니 다.
    읽 기 값 의 첫 번 째 문자{JSON 대상 형식 호출 AnalysisJSonObject 방법 으로 JSON 대상 분석
    먼저 Key 구 조 를 분석 하고 ReadString 을 호출 하여 Key 문자열 을 분석 하여 과목 의 값 을 얻 습 니 다.
    그리고 Value 를 분석 합 니 다.값 이 임의의 구조 일 수 있 기 때문에 ReadElement 를 사용 하여 JSON 구 조 를 분석 합 니 다.
    첫 번 째 문 자 를 읽 고 이 Value 가 문자열 이라는 것 을 알 수 있 습 니 다.이 Value 의 값 언어 를 읽 기 위해 ReadString 을 호출 합 니 다.
    다음 문자 읽 기 JSON 대상 이 아 닌 마지막 문자}예,문자 대표 아래 에 키-Value 구조 가 존재 합 니 다.계속 읽 기
    먼저 Key 구 조 를 분석 하고 ReadString 을 호출 하여 Key 문자열 을 분석 하여 이 값 을 얻 습 니 다.
    그리고 Value 를 분석 합 니 다.값 이 임의의 구조 일 수 있 기 때문에 ReadElement 를 사용 하여 JSON 구 조 를 분석 합 니 다.
    첫 번 째 문 자 를 읽 어 보 니 9 가 숫자 였 습 니 다.아래 의 이 구 조 는 수치 형식 호출 방법 인 ReadJSonNumber 로 수치 형식 을 읽 습 니 다.
    다음 문 자 를 읽 어 보 니}JSON 대상 의 끝 문자 입 니 다.JSON 대상 분석 을 종료 하고 분 석 된 JSON 대상 구조 인 스 턴 스 를 되 돌려 줍 니 다.
    다음 문 자 를 읽 어 보 니]JSON 배열 의 끝 입 니 다.JSON 배열 을 분석 하고 분 석 된 JSON 배열 구조 인 스 턴 스 를 되 돌려 줍 니 다.
    3.코드 구현
    
      /// <summary>
      /// JSON    
      /// </summary>
      public static class JsonConvert
      {
        /// <summary>
        ///   JSON
        /// </summary>
        /// <param name="text">    JSON   </param>
        /// <returns>     JSON    </returns>
        public static JsonElement AnalysisJson(string text)
        {
          var index = 0;
          //        
          ReadToNonBlankIndex(text, ref index);
          if (text[index++] == '[')
            //    
            return AnalysisJsonArray(text, ref index);
          //    
          return AnalysisJsonObject(text, ref index);
        }
    
        /// <summary>
        ///   JSON  
        /// </summary>
        /// <param name="text">JSON   </param>
        /// <param name="index">      </param>
        /// <returns>JSON  </returns>
        private static JsonObject AnalysisJsonObject(string text, ref int index)
        {
          var jsonArray = new JsonObject();
          do
          {
            ReadToNonBlankIndex(text, ref index);
            if (text[index] != '"') throw new JsonAnalysisException($"       “{text[index]}”!  “\"”",index);
            index++;
            //     
            var name = ReadString(text, ref index);
            ReadToNonBlankIndex(text, ref index);
            if (text[index] != ':') throw new JsonAnalysisException($"       “{text[index]}”!",index);
            index++;
            ReadToNonBlankIndex(text, ref index);
            if (jsonArray.ContainsKey(name)) throw new JsonAnalysisException($"      :“{name}”",index);
            //     Element
            jsonArray.Add(name, ReadElement(text, ref index));
            //        
            ReadToNonBlankIndex(text, ref index);
          } while (text[index++] != '}');
    
          return jsonArray;
        }
    
        /// <summary>
        ///   JSON  
        /// </summary>
        /// <param name="text">JSON   </param>
        /// <param name="index">      </param>
        /// <returns>JSON  </returns>
        private static JsonArray AnalysisJsonArray(string text, ref int index)
        {
          var jsonArray = new JsonArray();
          do
          {
            ReadToNonBlankIndex(text, ref index);
            //     Element
            jsonArray.Add(ReadElement(text, ref index));
            //        
            ReadToNonBlankIndex(text, ref index);
          } while (text[index++] != ']');
    
          return jsonArray;
        }
    
        /// <summary>
        ///   JSONElement
        /// </summary>
        /// <param name="text">   </param>
        /// <param name="index">    </param>
        /// <returns>   Element</returns>
        private static JsonElement ReadElement(string text, ref int index)
        {
          switch (text[index++])
          {
            case '[':
              return AnalysisJsonArray(text, ref index);
            case '{':
              return AnalysisJsonObject(text, ref index);
            case '"':
              return new JsonString(ReadString(text, ref index));
            case 't':
              return ReadJsonTrue(text, ref index);
            case 'f':
              return ReadJsonFalse(text, ref index);
            case 'n':
              return ReadJsonNull(text, ref index);
            case '0':
            case '1':
            case '2':
            case '3':
            case '4':
            case '5':
            case '6':
            case '7':
            case '8':
            case '9':
              return ReadJsonNumber(text, ref index);
            default:
              throw new JsonAnalysisException($"  Element“{text[index]}”   【[、{{、\"、true、false、null】", index);
          }
        }
    
        /// <summary>
        ///      
        /// </summary>
        /// <param name="text">JSON   </param>
        /// <param name="index">    </param>
        /// <returns>JSON    </returns>
        private static JsonNumber ReadJsonNumber(string text, ref int index)
        {
          var i = index;
          while (i < text.Length && char.IsNumber(text[i]) || text[i] == '.') i++;
          if (double.TryParse(text.Substring(index - 1, i - index + 1), out var value))
          {
            index = i;
            return new JsonNumber(value);
          }
    
          throw new JsonAnalysisException("         !", i);
        }
    
        /// <summary>
        ///   NULL
        /// </summary>
        /// <param name="text">JSON   </param>
        /// <param name="index">    </param>
        /// <returns>  NULL</returns>
        private static JsonNull ReadJsonNull(string text, ref int index)
        {
          if (text[index++] == 'u' &&
            text[index++] == 'l' &&
            text[index++] == 'l')
          {
            return new JsonNull();
          }
    
          throw new JsonAnalysisException("  null  !", index);
        }
    
        /// <summary>
        ///   FALSE
        /// </summary>
        /// <param name="text">JSON   </param>
        /// <param name="index">    </param>
        /// <returns>   - </returns>
        private static JsonBoolean ReadJsonFalse(string text, ref int index)
        {
          if (text[index++] == 'a' &&
            text[index++] == 'l' &&
            text[index++] == 's' &&
            text[index++] == 'e')
          {
            return new JsonBoolean(false);
          }
    
          throw new JsonAnalysisException("       !", index);
        }
    
        /// <summary>
        ///   TRUE
        /// </summary>
        /// <param name="text">JSON   </param>
        /// <param name="index">    </param>
        /// <returns>   - </returns>
        private static JsonBoolean ReadJsonTrue(string text, ref int index)
        {
          if (text[index++] == 'r' &&
            text[index++] == 'u' &&
            text[index++] == 'e')
          {
            return new JsonBoolean(true);
          }
          throw new JsonAnalysisException("       !",index);
        }
    
        /// <summary>
        ///      
        /// </summary>
        /// <param name="text">JSON   </param>
        /// <param name="index">    </param>
        /// <returns>    </returns>
        private static string ReadString(string text, ref int index)
        {
          //        
          var value = new StringBuilder();
          while (index < text.Length)
          {
            var c = text[index++];
            if (c == '\\')
            {
              value.Append('\\');
              if (index >= text.Length)
                throw new JsonAnalysisException("     !",index);
              c = text[index++];
              value.Append(c);
              if (c == 'u')
              {
                for (int i = 0; i < 4; i++)
                {
                  c = text[index++];
                  if (IsHex(c))
                  {
                    value.Append(c);
                  }
                  else
                  {
                    throw new JsonAnalysisException("     Unicode  !",index);
                  }
                }
              }
            }
            else if (c == '"')
            {
              break;
            }
            else if (c == '\r' || c == '
    ') { throw new JsonAnalysisException(" JSON !",index); } else { value.Append(c); } } return value.ToString(); } /// <summary> /// 16 /// </summary> private static bool IsHex(char c) { return c >= '0' && c <= '9' || c >= 'a' && c <= 'z' || c >= 'A' && c <= 'Z'; } /// <summary> /// /// </summary> /// <param name="text"> </param> /// <param name="index"> </param> /// <returns> </returns> private static void ReadToNonBlankIndex(string text, ref int index) { while (index < text.Length && char.IsWhiteSpace(text[index])) index++; } }
    전체 데모 코드 다운로드
    Github 프로젝트 주소(계속 업 데 이 트 됩 니 다):온라인 JOSN 포맷 검사 도구
    이상 은 c\#간단 한 json 해상도 기 를 어떻게 실현 하 는 지 에 대한 상세 한 내용 입 니 다.c\#json 해상도 기 를 실현 하 는 데 관 한 자 료 는 다른 관련 글 에 주목 하 십시오!

    좋은 웹페이지 즐겨찾기