2014-10-07 84 views
1

我的下一个JObject:如何提取JArray一定的价值,并把成JSON

{ 
    "Attrib1":"Value1", 
    "Atrrib2":"Value2", 
    "Inners": [ 
    { 
     "InnerAttrib1":"InnerValue1", 
     "InnerAttrib2":"InnerValue2" 
    }, 
    { 
     "InnerAttrib1":"InnerValue2", 
     "InnerAttrib2":"InnerValue3" 
    }, 
    { 
     "InnerAttrib1":"InnerValue4", 
     "InnerAttrib2":"InnerValue5" 
    } 
    ], 
    "Attrib3": "anotherThing" 
} 

我有提取“内在”的价值观,让REST调用的函数,我的REST服务只支持一个“内部件” ATTRIB的时候,就像是对例如:

{ 
     "Attrib1":"Value1", 
     "Atrrib2":"Value2", 
     "Inners": [ 
     { 
      "InnerAttrib1":"InnerValue2", 
      "InnerAttrib2":"InnerValue3" 
     } 
     ], 
     "Attrib3": "anotherThing" 
    } 

所以......我做了从“内件”提取一个值的函数:

public List<string> fillClient(JObject request) 
     { 
      var auxiliarJson = new JObject(); 
      var arraytoMerge=new JArray(); 
      var listResult = new List<string>(); 
      clientRest.EndPoint = "ClientEndPoint"; 
      auxiliarJson = request; 
      arraytoMerge = request.SelectToken("Inners") as JArray;    
      for (int innerCount = 0; innerCount < arraytoMerge.Count; innerCount++) 
      { 
       auxiliarJson.SelectToken("Inners").Replace(arraytoMerge[innerCount]);//My problem! 
       clientRest.PostData = request.ToString(); //fill the data to send 
       listResult.Add(clientRest.MakeRequest()); //Send the request 
      } 
      return listResult; 
     } 

当我做这个,我有一个错误(错误请求),调试我发现,我的“内件”就是如此:

"Inners": "{ 
      "InnerAttrib1":"InnerValue1", 
      "InnerAttrib2":"InnerValue2" 
     }" 

如何才能消除这种行情中括号的开始和结束,或者如果你可以向我建议一些替代方案,使其相同,谢谢!

回答

1

有一些事情我试图发现做的方式:

auxiliarJson.SelectToken("Inners").Replace(JToken.Parse("["+arraytoMerge[innerCount].ToString()+"]")); //My Solution! 
0

我的建议是不适用于JObject,除非您没有其他选择。如果你知道你的json的“模式”(并且在大多数情况下你确切地知道会发生什么并且忽略意外),那么你可以在POCO中反序列化你的json。然后,您可以随意操作强类型数据,然后在需要发送时将其序列化。

public class MyClass 
{ 
    public string Attrib1 {get; set;} 
    public string Attrib2 {get; set;} 
    public List<InnerClass> Inners {get; set;} 
    ... 
} 

public class InnerClass 
{ 
    ... 
} 

public void DoStuffWithInput(string input) 
{ 
    var myObject = JsonConvert.DeserializeObject<MyClass>(input); 
    foreach (InnerClass inner in myObect.Inners) 
    { 
     var innerJson = JsonConvert.SerializeObject(inner); 
     // do stuff 
    } 
}