在字符串中嵌入花括号的JSON反序列化

3

这个 JSON 负载中的一个节点让我头疼。

它的格式像一个字符串(在引号中),但它不能进入我的对象字符串。

这是整个负载,就像我收到的一样:

{
    "Event_Id":"da89afe72b41cb685f03261d8cb18d9e",
    "Event_Name":"Employee Created",
    "Event_DateTime":1655144130,
    "ClientCode":"XXXXX",
    "Resource_Field":"Employee",
    "Resource_Identifier":null,
    "Object":null,
    "Object_Identifier":"9995",

    "Data":"{"Employee_ID":"9995","Is_Rehire":"N","Was_New_Hire":"Y"}",

    "Endpoint":"Employee",
    "EndpointUrl":"api/v1/employee/9995"
}

问题在于 "Data" 属性,为了清晰起见将其分离。
这是它所加载到的对象:
public class OutsideEvent
{
    public string Event_Id { get; set; }
    public string Event_Name { get; set; }
    public int Event_DateTime { get; set; }
    public string ClientCode { get; set; }
    public string Resource_Field { get; set; }
    public object Resource_Identifier { get; set; }
    public object Object { get; set; }
    public string? Object_Identifier { get; set; }

    **public string? Data { get; set; }**

    public string Endpoint { get; set; }
    public string EndpointUrl { get; set; }
}

使用Postman,我可以去掉“Data”值周围的引号,将其类型更改为对象,并将其反序列化为以下内容:
public class eventData
{
    public string Employee_ID { get; set; }
    public string Is_Rehire { get; set; }
    public string Was_New_Hire { get; set; }
}

但是我无法让发件人去掉引号,所以我必须想办法处理它?

我还试过使用[JsonIgnore]装饰Data属性,因为我不关心这个值,但它并没有改变任何东西。

非常感谢任何帮助。

谢谢!


我假设两个双星号实际上不是文件的一部分,而只是为了我们的方便而放置在那里,突出了有问题的部分。然而,如果文件的其余部分完全像这样,那么这就不是有效的JSON,纯粹而简单。具体来说,该字符串中的双引号应该被转义,你应该有类似这样的内容:"Data":"{"Employee_ID":"9995","Is_Rehire":"N","Was_New_Hire":"Y"}" - Lasse V. Karlsen
是的,我以为那些 * 会使它变粗 :) - Rich
看一下 Serge 提供的答案,它展示了另一种查看您问题的方式,基本上停止将其视为字符串并将大括号移到字符串外部,这样您就有一个实际的 JSON 对象。换句话说,您会得到 "Data": {"Employee_ID":"9995", ... :"Y"},由于大括号现在不再被包含在字符串中,它们代表一个 JSON 对象的开始和结束。这可能是处理它的最简单方法。 - Lasse V. Karlsen
你需要修复导致无效JSON的任何问题。 - Charlieface
1个回答

2

JSON数据属性是无效的字符串,因为它包含在双引号中的双引号。

....
"Data":"{"Employee_ID":"9995","Is_Rehire":"N","Was_New_Hire":"Y"}",
....

所以只需删除外部双引号,您可以使用字符串替换函数来完成此操作。
    json = json.Replace("\"{", "{").Replace("}\"","}");

现在您拥有一个有效的JSON。
...
"Data":{"Employee_ID":"9995","Is_Rehire":"N","Was_New_Hire":"Y"},
....

而且您可以将其反序列化为C#。

    Root root=JsonConvert.DeserializeObject<Root>(json);

public class Data
{
    public string Employee_ID { get; set; }
    public string Is_Rehire { get; set; }
    public string Was_New_Hire { get; set; }
}

public class Root
{
    public string Event_Id { get; set; }
    public string Event_Name { get; set; }
    public int Event_DateTime { get; set; }
    public string ClientCode { get; set; }
    public string Resource_Field { get; set; }
    public object Resource_Identifier { get; set; }
    public object Object { get; set; }
    public string Object_Identifier { get; set; }
    public Data Data { get; set; }
    public string Endpoint { get; set; }
    public string EndpointUrl { get; set; }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接