【问题标题】:Remove double curly brackets from JObject that have been added during deserialization从反序列化期间添加的 JObject 中删除双花括号
【发布时间】:2017-05-07 02:19:33
【问题描述】:

我有一个以大括号“{}”开头和结尾的 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 在反序列化时继承一个额外的花括号?

【问题讨论】:

  • 同样的问题。{{ "name": "john", "surname": "doe", "complexObj": { "id": 1, "name": "test" } } }。我需要删除双括号并将其用作 Jobject itef。所以不能转换为字符串。任何解决方案???
  • @remyathekkuvettil 您是否在不使用 ToString() 的情况下找到了解决方案

标签: c# json


【解决方案1】:

这是造成问题还是您只是好奇?当我将数据作为另一个容器类中的“对象”类型发送时,我遇到了同样的问题。容器本身被正确反序列化,但里面的对象没有。由于双花括号,我认为它没有反序列化它。实际上,这似乎就是 JObjects 的样子。真正的原因可能是因为我关闭了它发送类型信息的设置,并且由于我正在反序列化为“对象”,它不可能仅从字符串中知道类型。

不管怎样,我注意到如果你对它执行“.ToString()”,那么双花括号就会消失。这意味着我只需执行以下操作即可解决我的问题:

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

我不确定这是否是一个错误,但我的猜测是它只是一个内部实现细节,这就是为什么当你“.ToString()”时他们会“修复”它。

【讨论】:

  • ToString() 之后我的还是一样
  • 如果我想反序列化 JObject 中的一些值,那么我需要使用 JObject 访问它,这是不可能的,因为双花括号@Brent
【解决方案2】:

就我而言,我想要

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

【讨论】:

  • 这个原始对象像这样"object" : { [ {"a"="b"}, {"a"="b"}, {"a"="b"} ] }
【解决方案3】:

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

【讨论】:

    猜你喜欢
    • 2020-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多