2013-06-15 5 views
2

저는 고용주를 위해 Cisco의 ClearAccess 애플리케이션에 대한 인터페이스를 구축하고 있으며, 이상한 점을 발견하고 누군가가이를 처리하는 방법에 대한 제안을 가지고 있는지 궁금해했습니다.JSON.NET 필드 이름에 숫자가 있습니까?

JSON 객체는 "고객이 네트워크에서 가지고있는 것을 모두 얻으십시오"라는 간단한 호출에서 돌아 오면 많은 정보를 반환합니다.이 정보를 찾을 때까지는 일부 계획 오래된 객체로 쉽게 비 직렬화 할 수 있습니다 믹스 :

"Settings.Hosts.35.Active", "거짓" "Settings.Hosts.17.Active"

는 기본적으로 내가 요소를 포함하는 큰 개체가 "거짓" "Settings.Hosts.xx.Active", "Settings.Hosts.xx.MACAddress"등의 명명 규칙을 따릅니다.

문서는 시스코에서 최상의 스케치입니다 (객체 정의조차도 부족합니다). 따라서 최대 Host.xx가 안전한지 궁금하거나 JSON.NET을 나의 의지에 맞게 변형 할 수있는 방법이 있는지 궁금하게 생각합니다. (개념적으로) "Settings.Host"{ "MACAddress": "xx : xx : xx : xx : xx", "활성": "false"}의 컬렉션으로이 번호가 매겨진 요소를 강제합니다.

커스텀 파서 (JsonProperty decoration)를 사용하고 있지만, 복사하는 예제를 찾는 데 실패했습니다.

답변

0

JSON 문자열을 JObject으로 역 직렬화하면 개체를 조작하여 개체를 다시 작성할 수 있습니다.

// suppose your string deserialized into this structure 
var obj = new JObject(
    new JProperty("Settings.Hosts.35.Active", false), 
    new JProperty("Settings.Hosts.35.MACAddress", "xx:xx:xx:xx:xx"), 
    new JProperty("Settings.Hosts.37.Active", false) 
); 

var re = new Regex(@"^Settings\.Hosts\.(\d+)\.(\w+)$"); 
var newObj = new JObject(
    new JProperty("Settings.Hosts", 
     new JObject(
      from prop in obj.Cast<JProperty>() 
      let m = re.Match(prop.Name) 
      where m.Success 
      let id = m.Groups[1].Value 
      let propertyName = m.Groups[2].Value 
      group new JProperty(propertyName, prop.Value) by id into g 
      select new JProperty(g.Key, new JObject(g)) 
     ) 
    ) 
); 

예컨대, 이상적 코드는 JsonConverter 될 것이다. 이렇게하면 다음 JSON 문자열이 생성됩니다.

// before 
{ 
    "Settings.Hosts.35.Active": false, 
    "Settings.Hosts.35.MACAddress": "xx:xx:xx:xx:xx", 
    "Settings.Hosts.37.Active": false 
} 

// after 
{ 
    "Settings.Hosts": { 
    "35": { 
     "Active": false, 
     "MACAddress": "xx:xx:xx:xx:xx" 
    }, 
    "37": { 
     "Active": false 
    } 
    } 
} 
+0

옙. 그게 효과가있다. – 3boysdad

관련 문제