从反序列化期间添加的JObject中删除双花括号

时间:2016-12-21 15:35:12

标签: c# json

我有一个JSON字符串,以大括号“{}”开头和结尾。

然后我反序列化了对象,但是当这个完成后,我看到我现在在开头和结尾处都有两个大括号“{{}}”。

我的代码看起来像这样

    //deserializeobject json string into jobject
        JObject loanVersionedDoc = JsonConvert.DeserializeObject<JObject>(s);        

    //Get the latest value from versioned document

        JObject loanLatestVersion = Versioning.demultiplicifyingParseForLatest(loanVersionedDoc);

    //TODO get the latest activity.isComplete value

        string activityCompletionStatus = (string)loanVersionedDoc.GetValue("Activities[0].isComplete");

这是我的JSON字符串的样子

"{ \"_id\" : \"582c459d54b6e43d307929f8\", \"LoanName\" :
...
 }

这就是我的loanVersionedDoc看起来像

{{
  "LoanName": "Test One",
  "isActive": "True",
  "Stages": [
    {
      "StageName": "Stage One",
      "isComplete": false
    },
    {
      "StageName": "Stage Two - CAG Approval and Indicative Terms",
      "isComplete": true
    },
    {
      "StageName": "Stage Three",
      "isComplete": false
    }
  ],
  "Activities": [
    {
      "ActivityName": "Generate due diligence report",
      "isComplete": "Complete",
      "ActivityParent": "Stage Two - CAG Approval and Indicative Terms"
    },
    {
      "ActivityName": "Received Stage 2 document from BDM",
      "isComplete": "NA",
      "ActivityParent": "Stage Two - CAG Approval and Indicative Terms"
    },
...
}}

在反序列化时,如何使JObject继承一个额外的花括号,我必须做错什么?

3 个答案:

答案 0 :(得分:11)

这会导致问题还是您只是好奇?当我将数据作为类型&#34;对象&#34;发送时,我遇到了同样的问题。在另一个容器类中。容器本身正在被反序列化,但内部的对象不是。我认为它不会因为双花括号而反序列化。实际上,似乎可能只是JObjects的样子。真正的原因可能是因为我关闭了它发送类型信息的设置,因为我反序列化为&#34; object&#34;它不可能只知道字符串中的类型。

无论哪种方式,我注意到你做过&#34; .ToString()&#34;然后双花括号就会消失。这意味着我能够通过简单地解决我的问题:

var someType = JsonConvert.DeserializeObject<SomeType>(jObject.ToString());

我不确定这是不是错误,但我的猜测是它只是一个内部实施细节,这就是他们为什么要修复它的原因。当你&#34; .ToString()&#34;。

答案 1 :(得分:0)

我想要的是

"object" : {
        [
            {"a"="b"},
            {"a"="b"},
            {"a"="b"},
            [
                {"a"="b"},
                {"a"="b"}
            ]
        ]
    }

To

"object" : {
        [
            {"a"="b"},
            {"a"="b"},
            {"a"="b"},
            {"a"="b"},
            {"a"="b"}
        ]
    }

太简单了,我像这样使用foreach

alpha =  @"[{'a'='b'},{'a'='b'}]";
JArray arrayObject = JArray.Parse(alpha);
foreach (var item in arrayObject)
{
    obj["object"].Last.AddAfterSelf(item);
}

答案 2 :(得分:-1)

Brent 接受的答案很好地揭示了问题的原因,但是,通过对象到字符串然后字符串到对象的解决方案效率低下,而不是使用 JObject 提供的方法。

class Container
{
  public int Number {get;set;}

  //Up to the client to deserialize to a strong type, like MyParamsType.
  public object Params {get;set;}
}

容器类被正确反序列化,但是,参数出现在带有双大括号的调试器中,所以我不能这样做:

  MyParamsType t = (MyType)container.params;

解决办法是

  var jObject = (Newtonsoft.Json.Linq.JObject)container.Params;
  MyParamsType p = jObject.ToObject<MyParamsType();
相关问题