小编Bri*_*ers的帖子

如何使用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万
查看次数

如何在没有格式化的情况下序列化JObject?

我有一个JObject(我使用的是Json.Net),我使用LINQ to JSON构建(也由同一个库提供).当我调用ToString()方法时JObject,它将结果输出为格式化的JSON.

如何为此设置格式为"无"?

serialization json json.net

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

忽略Json.net中的空字段

我有一些数据,我必须序列化为JSON.我正在使用JSON.NET.我的代码结构与此类似:

public struct structA
{
    public string Field1;
    public structB Field2;
    public structB Field3;
}

public struct structB
{
    public string Subfield1;
    public string Subfield2;
}
Run Code Online (Sandbox Code Playgroud)

问题是,我的JSON输出需要只有Field1OR Field2Field3- 它取决于使用哪个字段(即不为空).默认情况下,我的JSON看起来像这样:

{
    "Field1": null,
    "Field2": {"Subfield1": "test1", "Subfield2": "test2"},
    "Field3": {"Subfield1": null, "Subfield2": null},
}
Run Code Online (Sandbox Code Playgroud)

我知道我可以使用NullValueHandling.Ignore,但这给了我看起来像这样的JSON:

{
    "Field2": {"Subfield1": "test1", "Subfield2": "test2"},
    "Field3": {}
}
Run Code Online (Sandbox Code Playgroud)

而我需要的是:

{
    "Field2": {"Subfield1": "test1", "Subfield2": "test2"},
}
Run Code Online (Sandbox Code Playgroud)

有没有简单的方法来实现这一目标?

.net c# serialization json json.net

67
推荐指数
2
解决办法
5万
查看次数

Json.Net中的PreserveReferencesHandling和ReferenceLoopHandling有什么区别?

我正在查看一个具有以下编码的WebAPI应用程序示例:

json.SerializerSettings.PreserveReferencesHandling 
   = Newtonsoft.Json.PreserveReferencesHandling.Objects;
Run Code Online (Sandbox Code Playgroud)

和另一个有这个编码:

json.SerializerSettings.ReferenceLoopHandling 
   = Newtonsoft.Json.ReferenceLoopHandling.Ignore;
Run Code Online (Sandbox Code Playgroud)

既没有解释为什么选择每一个.我是WebAPI的新手,所以有人可以通过简单的方式向我解释这些差异是什么以及为什么我可能需要使用一个而不是另一个.

c# asp.net json json.net asp.net-web-api

59
推荐指数
1
解决办法
2万
查看次数

JSON.net ContractResolver与JsonConverter

我已经和JSON.net合作了一段时间.我已经编写了自定义转换器和自定义合同解析器(通常来自修改SO和Newtonsoft网站上的示例),它们工作正常.

除了例子之外,我面临的挑战是,我什么时候应该使用其中一个(或两个)进行处理.根据我自己的经验,我基本上已经确定合同解决方案更简单了,所以如果我可以用他们做我需要的东西,我会这样做; 否则,我使用自定义JsonConverters.但是,我进一步知道两者有时一起使用,因此概念变得更加不透明.

问题:

  1. 是否存在区分何时用户与其他用户的来源?我发现Newtonsoft文档不清楚这两者是如何区分的,或者何时使用其中一种.
  2. 两者之间的排序管道是什么?

json.net

56
推荐指数
1
解决办法
1万
查看次数

使用Json.Net解析JSON数组

我正在使用Json.Net来解析数组.我想要做的是从数组中提取名称/值对,并在解析JObject时将它们分配给特定的变量.

这是我在数组中得到的:

[
  {
    "General": "At this time we do not have any frequent support requests."
  },
  {
    "Support": "For support inquires, please see our support page."
  }
]
Run Code Online (Sandbox Code Playgroud)

这就是我在C#中得到的:

WebRequest objRequest = HttpWebRequest.Create(dest);
WebResponse objResponse = objRequest.GetResponse();
using (StreamReader reader = new StreamReader(objResponse.GetResponseStream()))
{
    string json = reader.ReadToEnd();
    JArray a = JArray.Parse(json);

    //Here's where I'm stumped

}
Run Code Online (Sandbox Code Playgroud)

我是JSON和Json.Net的新手,所以它可能是其他人的基本解决方案.我基本上只需要在foreach循环中分配名称/值对,以便我可以在前端输出数据.有没有人这样做过?

c# asp.net json json.net

54
推荐指数
1
解决办法
10万
查看次数

在C#中迭代JSON对象

我在C#中使用JSON.NET来解析来自Klout API的响应.我的回答是这样的:

[
  {
    "id": "5241585099662481339",
    "displayName": "Music",
    "name": "music",
    "slug": "music",
    "imageUrl": "http://kcdn3.klout.com/static/images/music-1333561300502.png"
  },
  {
    "id": "6953585193220490118",
    "displayName": "Celebrities",
    "name": "celebrities",
    "slug": "celebrities",
    "imageUrl": "http://kcdn3.klout.com/static/images/topics/celebrities_b32741b6703151cc7bd85fba24c44c52.png"
  },
  {
    "id": "5757029936226020304",
    "displayName": "Entertainment",
    "name": "entertainment",
    "slug": "entertainment",
    "imageUrl": "http://kcdn3.klout.com/static/images/topics/Entertainment_7002e5d2316e85a2ff004fafa017ff44.png"
  },
  {
    "id": "3718",
    "displayName": "Saturday Night Live",
    "name": "saturday night live",
    "slug": "saturday-night-live",
    "imageUrl": "http://kcdn3.klout.com/static/images/icons/generic-topic.png"
  },
  {
    "id": "8113008320053776960",
    "displayName": "Hollywood",
    "name": "hollywood",
    "slug": "hollywood",
    "imageUrl": "http://kcdn3.klout.com/static/images/topics/hollywood_9eccd1f7f83f067cb9aa2b491cd461f3.png"
  }
]
Run Code Online (Sandbox Code Playgroud)

如您所见,它包含5个id标签.也许下次它会是6或1或其他一些数字.我想迭代JSON并获取每个id标记的值.在不知道会有多少循环的情况下,我无法运行循环.我怎么解决这个问题?

c# json json.net c#-4.0

44
推荐指数
2
解决办法
11万
查看次数

我可以在属性中指定路径以将我的类中的属性映射到我的JSON中的子属性吗?

有些代码(我无法更改)使用Newtonsoft.Json DeserializeObject<T>(strJSONData)从Web请求中获取数据并将其转换为类对象(我可以更改类).通过使用我的类属性进行装饰,[DataMember(Name = "raw_property_name")]我可以将原始JSON数据映射到我的类中的正确属性.有没有办法可以将JSON复杂对象的子属性映射到一个简单的属性?这是一个例子:

{
    "picture": 
    {
        "id": 123456,
        "data": 
        {
            "type": "jpg",
            "url": "http://www.someplace.com/mypicture.jpg"
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

除了URL之外,我不关心任何其他图片对象,因此不想在我的C#类中设置复杂对象.我真的只想要这样的东西:

[DataMember(Name = "picture.data.url")]
public string ProfilePicture { get; set; }
Run Code Online (Sandbox Code Playgroud)

这可能吗?

c# json json.net deserialization

44
推荐指数
4
解决办法
2万
查看次数

如何使用JSON.NET反序列化为嵌套/递归的Dictionary和List?

我需要将复杂的JSON blob反序列化为标准的.NET容器,以便在不了解JSON的代码中使用.它期望的事情是在标准的.NET类型,具体地Dictionary<string, object>List<object>其中"对象"可以是原语或递归(词典或列表).

我不能使用静态类型来映射结果,并且JObject/JToken不适合.理想情况下,有一些方法(通过Contracts可能?)将原始JSON转换为基本的.NET容器.

我一直在寻找任何方式来哄骗JSON.NET反序列化器在遇到"{}"或"[]"时创建这些简单类型,但收效甚微.

任何帮助赞赏!

.net json json.net deserialization

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

有没有办法在不使用JsonIgnore属性的情况下忽略Json.NET中的get-only属性?

有没有办法忽略使用Json.NET序列化程序的get-only属性但不使用JsonIgnore属性?

例如,我有一个具有这些get属性的类:

    public Keys Hotkey { get; set; }

    public Keys KeyCode
    {
        get
        {
            return Hotkey & Keys.KeyCode;
        }
    }

    public Keys ModifiersKeys
    {
        get
        {
            return Hotkey & Keys.Modifiers;
        }
    }

    public bool Control
    {
        get
        {
            return (Hotkey & Keys.Control) == Keys.Control;
        }
    }

    public bool Shift
    {
        get
        {
            return (Hotkey & Keys.Shift) == Keys.Shift;
        }
    }

    public bool Alt
    {
        get
        {
            return (Hotkey & Keys.Alt) == Keys.Alt;
        }
    }

    public …
Run Code Online (Sandbox Code Playgroud)

c# json json.net

41
推荐指数
4
解决办法
2万
查看次数