2017-09-21 1 views
2

다음은 내 JSON입니다 :JSON 문자열에서 속성 값을 업데이트하는 방법은 무엇입니까?

[ 
    { 
    "name": "Node-1", 
    "flag": true, 
    "myObj": { 
     region: { 
     info: { 
      name: null, 
      infoFlag: false, 

     } 
     } 
    }, 
    "nodes": [ 
     { 
     "name": "Node-1-1", 
     "flag": true, 
     "myObj": { 
      region: { 
      info: { 
       name: "abc", 
       infoFlag: false, 

      } 
      } 
     }, 
     "nodes": [ 
      { 
      "name": "Node-1-1-1", 
      "flag": true, 
      "myObj": { 
       region: { 
       info: { 
        name: "xyz", 
        infoFlag: false, 

       } 
       } 
      }, 
      "nodes": [ 

      ] 
      } 
     ] 
     } 
    ] 
    } 
] 

나는 다음과 같은 규칙을 내 위의 JSON 문자열의 두 가지 속성을 업데이트 할 :

신고 : 내가 맹목적으로 false이 속성을 업데이트 할.

infoFlag는 : infoname 속성이 null입니다 경우, 나는 그것이 not nullinfoFlagtrue 다른 false을하는 경우 업데이트 할.

따라서 이러한 규칙으로 JSON을 업데이트 한 후 JSON을 문자열로 사용하려고합니다.

참고 : 내 JSON에 클래스를 만들지 않으려는 많은 속성이 있으므로 위의 두 가지 규칙에 따라 속성을 deserialize하고 업데이트하지 않으려 고합니다. 수업과 비 직렬화하지 않고 작동합니다.

내가 그것을하려고 방법입니다

string json = "MyJson"; 
var temp = JArray.Parse(json); 
temp.Descendants() 
    .OfType<JProperty>() 
json = temp.ToString(); 

을하지만, 여기에 내가 JSON을 반복적으로 통과하는 방법으로 받고 있지 않다; 나는 당신의 요구에이 코드가 꽤 자세한 그렇게 우아하지 이해하지만, 작동 한 경우

Node-1 
    Node-1-1 
     Node-1-1-1 
+1

가능한 복제 https://stackoverflow.com/questions/4535840/ :두고

솔루션은 다음과 같이 될 수있다, 상기 되 동적 객체 - 사용 - json-net 사용) – GolezTrol

+1

클래스를 선언하지 않고도 deserialize 할 수 있습니다. (https://stackoverflow.com/questions/4535840/deserialize-json-object-into- 동적 객체 - 사용 - json-net). alertnative는 전혀 deserialize하지 않는 것이지만 정말로 훌륭한 파서를 작성해야합니다. – GolezTrol

+1

@GolezTrol이 질문을하는 주된 목적은 클래스에 직렬화를하지 않고 속성 값을 찾고 업데이트하는 방법이었습니다. 동적 객체에 json 문자열을 비 직렬화하는 방법을 잘 알고 있습니다 :) –

답변

1

Json.NET 는 더 열심히 문제의 작업을하게 dynamic로 JSON 컨텐츠를 나타내는 내부 객체를 처리 할 수 ​​없습니다 일반 형식 개체.

어려운 문제의 유일한 종류는 재귀 오브젝트 구조합니다 (nodes 배열)입니다,하지만 그건 JSON 또는 dynamic 특정 문제가 아니라, 여러 가지 방법으로 해결 될 수있다 - 명백한 재귀 적 방법 또는 내 것이 바람직 트리 평탄화 열거와 (내 답변에서 Expand 방법 How to flatten tree via LINQ?).

var array = JArray.Parse(json); 
var nodes = array.Cast<dynamic>().Expand(x => x.nodes); 
foreach (var node in nodes) 
{ 
    node.flag = true; 
    var info = node.myObj.region.info; 
    info.infoFlag = (info.name == null); 
} 
var newJson = array.ToString(); 
([Json.net를 사용하여 동적 객체로 탈 직렬화 JSON 오브젝트]의
+1

이것은 정말로 정말로 beautifull하다 :) –

+1

이것은 일했다. 매우 많이 감사하고, 평소와 같이 천재와 똑똑한 대답을 계속 해주시기 바랍니다 :) –

2

:이 결과 출력

JArray temp = JArray.Parse(json); 

    foreach (JToken tk in temp.Descendants()) 
    { 
     if (tk.Type == JTokenType.Property) 
     { 
      JProperty p = tk as JProperty; 

      if (p.Name == "flag") 
      { 
       if ((bool)p.Value.ToObject(typeof(bool)) == true) 
        p.Value = false; 
      } 

      if ((p.Name == "info") && p.HasValues) 
      { 
       bool flag = false; 

       foreach (JToken tkk in p.Descendants()) 
       { 
        if (tkk.Type == JTokenType.Property) 
        { 
         JProperty pp = tkk as JProperty; 

         if ((pp.Name == "name") && (pp.Value.Type == JTokenType.Null)) 
         { 
          flag = true; 
         } 

         if ((pp.Name == "infoFlag")) 
         { 
          pp.Value = (flag == true) ? true : false; 
         } 
        } 
       } 
      } 
     } 
    } 

    json = temp.ToString(); 

: 당신은 내가 재귀 구조 아래와 같이가 볼 수

을 사용하는 것보다
[ 
    { 
    "name": "Node-1", 
    "flag": false, 
    "myObj": { 
     "region": { 
     "info": { 
      "name": null, 
      "infoFlag": true 
     } 
     } 
    }, 
    "nodes": [ 
     { 
     "name": "Node-1-1", 
     "flag": false, 
     "myObj": { 
      "region": { 
      "info": { 
       "name": "abc", 
       "infoFlag": false 
      } 
      } 
     }, 
     "nodes": [ 
      { 
      "name": "Node-1-1-1", 
      "flag": false, 
      "myObj": { 
       "region": { 
       "info": { 
        "name": "xyz", 
        "infoFlag": false 
       } 
       } 
      }, 
      "nodes": [] 
      } 
     ] 
     } 
    ] 
    } 
] 
+0

나에게 도움이되는 당신의 친절한 노력으로 Upvoted. 감사 : –

관련 문제