簡體   English   中英

從 JObject 中刪除反序列化過程中添加的雙大括號

[英]Remove double curly brackets from JObject that have been added during deserialization

我有一個以大括號“{}”開頭和結尾的 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 繼承一個額外的大括號?

這是造成問題還是您只是好奇? 當我在另一個容器類中將數據作為“對象”類型發送時,我遇到了同樣的問題。 容器本身被正確反序列化,但里面的對象沒有。 我認為它不是因為雙花括號而反序列化它。 實際上,這似乎就是 JObjects 的樣子。 真正的原因可能是因為我關閉了它發送類型信息的設置,並且由於我正在反序列化為“對象”,它不可能僅從字符串中知道類型是什么。

無論哪種方式,我注意到如果你在它上面做了“.ToString()”,那么雙花括號就會消失。 這意味着我可以通過簡單地執行以下操作來解決我的問題:

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

我不確定這是否是一個錯誤,但我的猜測是它只是一個內部實現細節,這就是為什么當你“.ToString()”時他們將它“修復”。

就我而言,我想要

"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);
}

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();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM