如何从JArray中提取一些值并将其放入JSon中

本文关键字:JSon JArray 提取 | 更新日期: 2023-09-27 18:25:53

我有下一个JObject:

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

我有一个提取"Inner"值并进行REST调用的函数,我的REST服务一次只支持一个"Inners"属性,例如:

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

所以。。。我做了一个函数,从"Inners"中提取一个值:

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"就是这样的:

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

如何删除括号开头和结尾的引号,或者如果你能向我建议一些替代方案,谢谢!

如何从JArray中提取一些值并将其放入JSon中

尝试一些我找到的方法:

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

我的建议是不要使用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
    }
}