2017-04-21 4 views
0

피들러를 사용하여 모든 요청 및 응답을 읽으려고했지만 어떤 경우에는 요청 데이터를 JSON으로 가져오고 그 JSON을 키 값 쌍으로 구문 분석하려고합니다.임의의 Json을 키 값 쌍으로 구문 분석

나는이

string requestPost = Utilities.UrlDecode(oSession.GetRequestBodyAsString()); 
Dictionary<string, string> jsonRequest = new Dictionary<string, string>(); 
jsonRequest = JsonConvert.DeserializeObject<Dictionary<string, string>>(requestPost); 
dataGridViewFiddler.DataSource = jsonRequest; 

같은 시도하지만 나를 위해 작동하지 않았다.

이 내 JSON 형식

{"entries":[{"http_response_code":200,"network_changed":false,"protocol":"QUIC","request_age_ms":112425,"request_elapsed_ms":27,"sample_rate":0.05,"server_ip":"216.58.197.78:443","status":"ok","url":"https://www.google-analytics.com/","was_proxied":false}],"reporter":"chrome"} 
이제

내가이 JSON에게 그 작업을 구문 분석하는 동적 사용하는 경우 만

+0

'requestPost'가 어떻게 보이는지 알려주세요. – Luke

+0

@ 루크 요청 포스트는 어떤 JSON 일 수 있습니다. –

+0

JSON이 실제로 무엇이든 될 수 있다면 "[중첩 된/재귀 적 사전 및 목록으로 역 직렬화하기 위해 JSON.NET을 어떻게 사용해야합니까?"(http://stackoverflow.com)/q/5546142/10263) "도움을받을 수 있습니다. 그러나 모든 JSON을 키 - 값 쌍으로 파싱 할 수있는 것은 아닙니다. JSON에서 배열로 시작한다면, 파싱 할 때리스트로 끝날 것이다. –

답변

1

당신이 어떤 JSON를 역 직렬화 할 수있게하려면

enter image description here

입니다, 당신이 역 직렬화 할 필요가있는 타입은 dynamic이 아니라 Dictionary<string, dynamic>이 아니기 때문에 JSON에 문자열 키가 있어야한다는 의미 일 것입니다.의 요청에 따라

따라서, 어떤 JSON 객체를 직렬화하기 위해, , 당신은 코드를 사용해야합니다 JSON은 간단 할 수 있다는 것을 염두에

var json = JsonConvert.DeserializeObject(requestPost); 

베어링 등 :

["bob", "fred"] 

어떤 키가 없으므로 모델과 일치하지 않습니다 (사전에 문자열).

0

귀하는 JSON을받을 수 있음을 명시합니다. 그러나 구조화 된 방식으로 데이터를 사용하려면 여전히 데이터를 구문 분석해야하므로 심각한 문제가 발생할 수 있습니다. 따라서 항상 비슷한 입력을 받아야합니다. 나는 당신에게 가장 적합한 옵션을 줄 것이다.

옵션 1 : 데이터가 key/value 레이아웃을 다음 경우DictionaryJSON을 드 - 직렬화에만 작동합니다. 따라서 레이아웃은 항상 다음과 같아야합니다.

물론이 값은 목록이 될 수도 있습니다. 그러나 기본 레이아웃은 여전히 ​​동일합니다. 예를 들어 :

{ 
    "key1": ["value1", "value2"], 
    "key2": ["value3", "value4"] 
} 

이 당신은 당신의 코드를 역 직렬화 할 수 있습니다

var dict = JsonConvert.DeserializeObject<Dictionary<string, dynamic>>(requestPost); 

옵션 2 : JSON 데이터가 사용자 정의 데이터 이름으로 구성되어있는 경우, 당신은 해당 모델을 만들어야합니다. 올바른 방향을 제시하는 좋은 도구는 json2csharp입니다. 예를 들어 보겠습니다.이 경우 귀하의 JSON :

public class Value 
{ 
    public string First { get; set; } 
    public string Second { get; set; } 
} 

public class RootObject 
{ 
    public string Key { get; set; } 
    public List<Value> Values { get; set; } 
} 

그리고 당신은 다음과 같이 직렬화 복원 할 수 있습니다 :

[{ 
    "Key": "MyKey", 
    "Values": [{ 
     "First": "RandomValue", 
     "Second": "RandomValue" 
    }, { 
     "First": "RandomValue", 
     "Second": "RandomValue" 
    }] 
}, 
{ 
    "Key": "MyKey", 
    "Values": [{ 
     "First": "RandomValue", 
     "Second": "RandomValue" 
    }, { 
     "First": "RandomValue", 
     "Second": "RandomValue" 
    }] 
}] 

는 그런 다음 해당 모델은해야 당신도 할 수 있습니다

var values = JsonConvert.DeserializeObject<List<RootObject>>(json); 

결론,JSON 데이터가 Dictionarykey/value 쌍으로 구성되어 있는지 확인하십시오. 이 경우 Dictionary으로 직접 deserialize 할 수 있습니다. 그렇지 않으면 사용자의 JSON 데이터에 맞게 사용자 지정 모델을 만들어야합니다. 당신에게 가장 잘 맞는 것을 사용하십시오! 랜덤 데이터를 deserialize 할 수는 있지만 코드가 데이터를 처리 할 수 ​​있는지 확인하는 것은 매우 어렵습니다. 이 작업을 수행하는 방법은 Luke's answer을 참조하십시오.