c\#간단 한 제 이 슨 해석 기 를 어떻게 실현 합 니까?
2.해석 원리 소개
분석 대상{}대상 구 조 는{"Key":[값]}의 형식 이 므 로 먼저 Key 문자열 로 해석 하고 Key 를 분석 한 다음 값 으로 해석 합 니 다.값 은[문자열,값 유형,불 유형,대상,배열,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 구 조 를}대상 의 꼬리 문자 까지 반복 적 으로 해석 하기 시작 합 니 다.
[{"과목":"국어","성적":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 해상도 기 를 실현 하 는 데 관 한 자 료 는 다른 관련 글 에 주목 하 십시오!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
C#Task를 사용하여 비동기식 작업을 수행하는 방법라인이 완성된 후에 이 라인을 다시 시작할 수 없습니다.반대로 조인(Join)만 결합할 수 있습니다 (프로세스가 현재 라인을 막습니다). 임무는 조합할 수 있는 것이다. 연장을 사용하여 그것들을 한데 연결시키는 것이...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.