相关疑难解决方法(0)

如何使用JSON.net处理同一属性的单个项目和数组

我正在尝试修复我的SendGridPlus库来处理SendGrid事件,但是我在API中对类别的处理方式不一致时遇到了一些麻烦.

在以下示例从SendGrid API引用获取的有效内容中,您会注意到category每个项的属性可以是单个字符串,也可以是字符串数组.

[
  {
    "email": "john.doe@sendgrid.com",
    "timestamp": 1337966815,
    "category": [
      "newuser",
      "transactional"
    ],
    "event": "open"
  },
  {
    "email": "jane.doe@sendgrid.com",
    "timestamp": 1337966815,
    "category": "olduser",
    "event": "open"
  }
]
Run Code Online (Sandbox Code Playgroud)

看起来像我这样制作JSON.NET的选择是在字符串进入之前修复字符串,或者配置JSON.NET以接受不正确的数据.如果我能逃脱它,我宁愿不做任何字符串解析.

有没有其他方法我可以使用Json.Net处理这个?

json.net sendgrid

82
推荐指数
3
解决办法
3万
查看次数

当 JSON 字典为空时,反序列化 JSON 字符串失败

目前,当我尝试使用Newtonsoft.Json反序列化从第 3 方收到的 json 字符串(--> 我无法自己更改接收到的 json 字符串)时,我面临以下问题:

json 包含一个字典(以及我未在此处列出的其他一些条目):

"food": {
        "Menu 1": "abc",
        "Menu 2": "def"
}
Run Code Online (Sandbox Code Playgroud)

我创建了一个包含该属性的类(加上我在此处未列出的属性):

Dictionary<string, string> Food {get; set;}
Run Code Online (Sandbox Code Playgroud)

在这种情况下,json 的反序列化效果很好。当食物空了时就会出现问题:

{
      "food": [],
}
Run Code Online (Sandbox Code Playgroud)

在这种情况下,食物似乎不是字典而是数组。 这就是反序列化失败并出现以下错误的原因:

Newtonsoft.Json.JsonSerializationException:“无法将当前 JSON 数组(例如 [1,2,3])反序列化为类型 'System.Collections.Generic.Dictionary`2[System.String,System.String]',因为该类型需要JSON 对象(例如 {"name":"value"})以正确反序列化。要修复此错误,请将 JSON 更改为 JSON 对象(例如 {"name":"value"})或将反序列化类型更改为数组或实现集合接口(例如 ICollection、IList)的类型(例如可以从 JSON 数组反序列化的 List)。还可以将 JsonArrayAttribute 添加到该类型以强制其从 JSON 数组反序列化。路径“食物”。”

请问有人可以帮我解决这个问题吗?

编辑去 盐化代码:

public T DeserializeAPIResults<T>(string json)
{
        JObject obj = JsonConvert.DeserializeObject<JObject>(json);
        return obj.GetValue("canteen").ToObject<T>();
}
Run Code Online (Sandbox Code Playgroud)

编辑2 完整的json值:

        {
        "canteen": [
            {
                "name": "Canteen1",
                "src": "a …
Run Code Online (Sandbox Code Playgroud)

c# json.net

9
推荐指数
1
解决办法
5117
查看次数

标签 统计

json.net ×2

c# ×1

sendgrid ×1