2012-10-01 8 views
32

C#에서 Json 문자열을 읽으려고하는데 문자열을 C#으로 구문 분석하는 방법을 알아 내는데 어려움이 있습니다. 내가C#에서 Json 문자열을 구문 분석합니다.

내가 Json.Net 주위에 놀겠다는 거 봤는데
descriptionList["AppName"] = "Lorem ipsum dolor sit amet"; 
valueList["AppName"] = "1"; 

하지만 예 I 같은 형식을 사용하여, ArrayList에 또는 사전에 그 구문을 분석 할 나는 다음과 같은 JSON 문자열

[ 
    { 
     "AppName": { 
      "Description": "Lorem ipsum dolor sit amet", 
      "Value": "1" 
     }, 
     "AnotherAppName": { 
      "Description": "consectetur adipisicing elit", 
      "Value": "String" 
     }, 
     "ThirdAppName": { 
      "Description": "sed do eiusmod tempor incididunt ut labore et dolore magna aliqua", 
      "Value": "Text" 
     }, 
     "Application": { 
      "Description": "Ut enim ad minim veniam", 
      "Value": "100" 
     }, 
     "LastAppName": { 
      "Description": "quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat", 
      "Value": "ZZZ" 
     } 
    } 
] 

을 말해봐 내가 본 일을 어떻게해야하는지 명확히 알지 못한다. 이것을 달성하는 가장 좋은 방법은 무엇입니까? 이것을 foreach 문을 사용하여 jQuery에서와 같이 수행 할 수 있다고 생각하십니까?

+0

당신이 [DynamicJson] (http://dynamicjson.codeplex.com/) JSON 문자열 밖으로 C#을 객체를 준비 할 수 있습니까? – rt2800

답변

32

내 프로젝트에 Json.net을 사용하고 있는데 그것을 잘 작동합니다.

편집 : 당신이 경우에, 당신은 당신의 JSON을 구문 분석이 작업을 수행 할 수 있습니다

void Main() 
{ 
    var json = System.IO.File.ReadAllText(@"d:\test.json"); 

    var objects = JArray.Parse(json); // parse as array 
    foreach(JObject root in objects) 
    { 
     foreach(KeyValuePair<String, JToken> app in root) 
     { 
      var appName = app.Key; 
      var description = (String)app.Value["Description"]; 
      var value = (String)app.Value["Value"]; 

      Console.WriteLine(appName); 
      Console.WriteLine(description); 
      Console.WriteLine(value); 
      Console.WriteLine("\n"); 
     } 
    } 
} 

: 그것은 구문 분석하여 JSON 파일 (배열)

코드를 읽고 지원, 그래서 나는 코드를 변경 출력 : BTW

AppName 
Lorem ipsum dolor sit amet 
1 


AnotherAppName 
consectetur adipisicing elit 
String 


ThirdAppName 
sed do eiusmod tempor incididunt ut labore et dolore magna aliqua 
Text 


Application 
Ut enim ad minim veniam 
100 


LastAppName 
quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat 
ZZZ 

, 당신은 당신의 코드를 테스트 LinqPad을 사용할 수 있습니다, Visual Studio에서 솔루션이나 프로젝트를 만드는 것보다 더 쉽게 I t hink.

+0

-1 원본 json은 대답이 –

+0

@ L.B에서와 같이 JArray가 JObject가 아니므로 바쁘다. 업데이트 된 코드가 배열을 읽습니다. –

+0

사실, 첫 번째 솔루션 (편집 이전)은 저에게 효과적이었습니다. – desto

13

당신은 System.Web.Script.Serialization.JavaScriptSerializer으로 시도 할 수 있습니다 : 대신 당신은 또한 동적를 사용할 수있는 ArrayList에 또는 사전

var json = new JavaScriptSerializer(); 
var data = json.Deserialize<Dictionary<string, Dictionary<string, string>>[]>(jsonStr); 
+0

그것은 System.Web.Script.Serialization에서 사용할 수있다 – Guillaume86

+0

나는이 serializer가 사전과 함께 작동한다고 생각하지 않는다 –

+0

그것은 이미 사용했다. 편집 : 그냥 내 코드를 @desto json으로 테스트했는데, 잘 작동한다. – Guillaume86

1

합니다. 대개이 시간에 EasyHttp을 사용하지만 다른 프로젝트에서도 동일한 작업을 수행합니다. 아래 예 : NuGet에

var http = new HttpClient(); 
http.Request.Accept = HttpContentTypes.ApplicationJson; 
var response = http.Get("url"); 
var body = response.DynamicBody; 
Console.WriteLine("Name {0}", body.AppName.Description); 
Console.WriteLine("Name {0}", body.AppName.Value); 

: EasyHttp

1

당신이 사전에 직렬화하려고 무슨 일이 실제로 JSON으로 직렬화 자바 스크립트 객체입니다. Javascript에서는이 객체를 연관 배열로 사용할 수 있지만 JSON 표준에 관한 한 실제로는 객체입니다.

표준 JSON 직렬 변환기 (예 : .net, DataContractJsonSerializer 및 JavascriptSerializer)를 개체 (AppName, AnotherAppName 등의 멤버)와 함께 직렬화 해제하는 데 아무런 문제가 없지만 실제로 이것을 다음과 같이 해석 할 수 있습니다. 사전 당신은 내가 아는 한 사전에 대해서는 아무것도 가지고 있지 않은 Json 스펙보다 더 멀리 나가는 serializer가 필요할 것이다.

한 예는 하나 개 모두 사용하면 JSON으로 직렬화하기 전에 목록에 자바 스크립트 객체를 변환하는 것입니다 외부 lib 디렉토리를 사용하지 않으려면 JSON .net

는 다른 솔루션이있다 . 당신은 JSON 객체으로 myList를 직렬화하는 경우

var myList = []; 
$.each(myObj, function(key, value) { myList.push({Key:key, Value:value}) }); 

지금, 당신은 상기 시리얼의와 List<KeyValuePair<string, ValueDescription>>에 직렬화 복원 할 수 있어야한다. 그 목록은 사전으로 변환하는 것이 아주 분명합니다.

참고 : 값 설명이 클래스 인 :

public class ValueDescription 
{ 
    public string Description { get; set; } 
    public string Value { get; set; } 
} 
12
json: 
[{"ew":"vehicles","hws":["car","van","bike","plane","bus"]},{"ew":"countries","hws":["America","India","France","Japan","South Africa"]}] 

C# 코드 : 단일 값 (예 : "bike")을 사용합니다.

//res=[{"ew":"vehicles","hws":["car","van","bike","plane","bus"]},{"ew":"countries","hws":["America","India","France","Japan","South Africa"]}] 

     dynamic stuff1 = Newtonsoft.Json.JsonConvert.DeserializeObject(res); 
     string Text = stuff1[0].hws[2]; 
     Console.WriteLine(Text); 

출력 :

bike 
관련 문제