2015-01-02 3 views
1

Newtonsoft.Json 사용 Path를 키로 사용하여 사전으로 JSON 객체를 변환하려면 어떻게해야합니까? 사전의Path를 키로 사용하여 JSON 객체를 사전으로 변환하는 방법

IDictionary<string, object> FlattenJson(string Json) 
{ 
    JToken Input = JToken.Parse(Json); 

    ... magic ... 

    return Result; 
} 

키는 JToken.Path 값이어야하며 사전의 값 (정수 문자열로 문자열, 긴, 등)의 "기본"형식의 실제 값으로한다.

"message.body.titles [0] .formats [0] .images [0] .uri"=> "I/41SKCXdML._SX160_SY120_.jpg" "message.body.titles [0] .formats [ 0] .images [0] .widthPx "=> 0 "message.body.titles [0] .customerReviewsCollectionIncluded "=>

가 있나요 ... 거짓 아웃 - 오브 - 박스 작동 임의의 JSON?

+0

나는이 작업을 수행하는 상자 밖의 것이 아무것도 없다고 생각합니다. JToken.Path가 고유하므로 키로 사용할 수 있습니까? – su8898

+0

가능한 복제본 [C# flattening json structure] (http://stackoverflow.com/questions/7394551/c-sharp-flattening-json-structure) – Jacob

+0

@Jacob - 저는 이것이 중복이라고 생각하지 않습니다. 그 대답은 배열을 다루지 않을 것이고, 키 텍스트를 정의하기 위해 다소 다른 계획을 사용한다. – dbc

답변

1
당신은 재귀 적으로 Json.NET 계층 구조를 탐색 (유형 JValue를) 프리미티브 값을 선택하고, 사전에 그 값을 저장과 같이 할 필요가

: 같이 호출 다음

public static class JsonExtensions 
{ 
    public static IEnumerable<JToken> WalkTokens(this JToken node) 
    { 
     if (node == null) 
      yield break; 
     yield return node; 
     foreach (var child in node.Children()) 
      foreach (var childNode in child.WalkTokens()) 
       yield return childNode; 
    } 

    public static IDictionary<string, object> ToValueDictionary(this JToken root) 
    { 
     return root.WalkTokens().OfType<JValue>().ToDictionary(value => value.Path, value => value.Value); 
    } 
} 

을 그리고

var Result = Input.ToValueDictionary(); 

정수는 Int64으로 저장됩니다.

관련 문제