나는 이틀 동안 코드 샘플 등을 다루면서 “faffing”의 가장 큰 부분을 보냈고, 매우 큰 JSON 파일을 c #의 배열로 읽으려고 시도했다.
내가 겪고있는 문제는 내가하려는 일을하는 사람들의 예를 찾을 수 없다는 것입니다. 이것은 내가 최선을 다하기 위해 코드를 약간 편집하고 있음을 의미했습니다.
나는 다음과 같은 일을 할 수 있었다.
- 파일을 읽습니다. 헤더를 생략하고 값을 배열로만 읽습니다.
- 배열의 각 행에 일정량의 값을 배치하십시오. (따라서 나중에 2D 배열로 넣을 수 있습니다)
이것은 아래 코드로 수행되었지만 배열에 몇 줄을 입력하면 프로그램이 충돌합니다. 파일 크기와 관련이있을 수 있습니다.
// If the file extension was a jave file the following
// load method will be use else it will move on to the
// next else if statement
if (fileExtension == ".json")
{
int count = 0;
int count2 = 0;
int inOrOut = 0;
int nRecords=1;
JsonTextReader reader = new JsonTextReader(new StreamReader(txtLoaction.Text));
string[] rawData = new string[5];
while (reader.Read())
{
if (reader.Value != null)
if (inOrOut == 1)
{
if (count == 6)
{
nRecords++;
Array.Resize(ref rawData, nRecords);
//textBox1.Text += "\r\n";
count = 0;
}
rawData[count2] += reader.Value + ","; //+"\r\n"
inOrOut = 0;
count++;
if (count2 == 500)
{
MessageBox.Show(rawData[499]);
}
}
else
{
inOrOut = 1;
}
}
}
내가 작업하고있는 JSON의 스 니펫은 다음과 같습니다.
[
{ "millis": "1000",
"stamp": "1273010254",
"datetime": "2010/5/4 21:57:34",
"light": "333",
"temp": "78.32",
"vcc": "3.54" },
]
이 JSON에서 값이 필요합니다. 예를 들어 “3.54”가 필요하지만 “vcc”를 인쇄하고 싶지는 않습니다.
누군가 JSON 파일을 읽는 방법을 보여주고 필요한 데이터 만 추출하여 배열에 넣거나 나중에 배열에 넣을 때 사용할 수있는 것으로 바라고 있습니다.
답변
Json.NET으로 모든 것을 쉽게 만드는 것은 어떻 습니까?
public void LoadJson()
{
using (StreamReader r = new StreamReader("file.json"))
{
string json = r.ReadToEnd();
List<Item> items = JsonConvert.DeserializeObject<List<Item>>(json);
}
}
public class Item
{
public int millis;
public string stamp;
public DateTime datetime;
public string light;
public float temp;
public float vcc;
}
클래스 dynamic
를 선언하지 않고도 동맹국 의 가치를 얻을 수 있습니다 Item
.
dynamic array = JsonConvert.DeserializeObject(json);
foreach(var item in array)
{
Console.WriteLine("{0} {1}", item.temp, item.vcc);
}
답변
이것을 스스로하는 것은 끔찍한 생각입니다. Json.NET을 사용하십시오 . 대부분의 프로그래머가 수개월 동안 작업을했을 경우보다 더 나은 문제를 이미 해결했습니다. 특정 요구 사항에 대해서는 배열 등으로 구문 분석하면 설명서 를 특히 확인하십시오 JsonTextReader
. 기본적으로 Json.NET은 기본적으로 JSON 배열을 처리하고이를 문자열, int 또는 메시지가 표시되지 않은 유형으로 구문 분석합니다. 다음 은 리더와 라이터의 기본 코드 사용법에 대한 직접 링크입니다. 따라서이 작업을 배우면서 여분의 창에서 열 수 있습니다.
이것은 최고입니다. 이번에는 게으르고 라이브러리를 사용하여이 일반적인 문제를 영원히 해결하십시오 .
답변
@LB의 솔루션을 기반으로 VB 코드는 (이 Object
아닌 형식으로 Anonymous
)
Dim oJson As Object = JsonConvert.DeserializeObject(File.ReadAllText(MyFilePath))
이 유형이 필요하지 않은 HTTP 호출 콘텐츠를 구성하는 데 빠르고 유용하다는 점을 언급해야합니다. 그리고 Object
오히려 사용 하는 것은 Visual Studio 환경에서 Anonymous
유지할 수 있다는 것을 의미합니다 Option Strict On
.
답변
string jsonFilePath = @"C:\MyFolder\myFile.json";
string json = File.ReadAllText(jsonFilePath);
Dictionary<string, object> json_Dictionary = (new JavaScriptSerializer()).Deserialize<Dictionary<string, object>>(json);
foreach (var item in json_Dictionary)
{
// parse here
}
답변
내가 사용하고있는 올바른 길을 찾기 위해
var pathToJson = Path.Combine("my","path","config","default.Business.Area.json");
var r = new StreamReader(pathToJson);
var myJson = r.ReadToEnd();
// my/path/config/default.Business.Area.json
[...] do parsing here
Path.Combine은 Path.PathSeparator를 사용하고 끝에 첫 번째 경로에 이미 구분 기호가 있는지 확인하여 구분 기호를 복제하지 않습니다. 또한 결합 할 경로 요소에 유효하지 않은 문자가 있는지 확인합니다.
참조 https://stackoverflow.com/a/32071002/4420355를
답변
JSON 구문 분석의 경우 웹 사이트 http://json2csharp.com/ (가장 쉬운 방법)을 사용하여 JSON을 C # 클래스로 변환하여 JSON을 C # 객체로 직렬화 해제하십시오.
public class JSONClass
{
public string name { get; set; }
public string url { get; set; }
public bool visibility { get; set; }
public string idField { get; set; }
public bool defaultEvents { get; set; }
public string type { get; set; }
}
그런 다음 newtonsoft와 같은 타사 DLL을 원하지 않는 경우 JavaScriptSerializer (System.Web.Script.Serialization의)를 사용하십시오.
using (StreamReader r = new StreamReader("jsonfile.json"))
{
string json = r.ReadToEnd();
JavaScriptSerializer jss = new JavaScriptSerializer();
var Items = jss.Deserialize<JSONClass>(json);
}
그런 다음 Items.name 또는 Items.Url 등으로 객체를 가져올 수 있습니다.
답변
다음과 같은 방법으로도 수행 할 수 있습니다.
JObject data = JObject.Parse(File.ReadAllText(MyFilePath));