小编Bri*_*ers的帖子

如何创建一个属性包含点(句点)的json字符串?

我正在尝试发送一个带有HttpRequest这样的JSON对象:

{
   "some.setting.withperiods":"myvalue"
}
Run Code Online (Sandbox Code Playgroud)

我一直在为我的其他请求创建匿名对象,但由于名称包含一个点,因此我不能这样做.

我知道我可以创建一个类并指定[DataMember(Name="some.setting.withperiods")]属性,但必须有一个更轻量级的解决方案.

c# json.net

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

使用 JsonConverterAttribute 时自定义继承 JsonConverter 失败

我正在尝试反序列化派生类型,并且我想使用自定义属性Type来区分派生类型。

[
  {
    "Type": "a",
    "Height": 100
  },
  {
    "Type": "b",
    "Name": "Joe"
  }
]
Run Code Online (Sandbox Code Playgroud)

我找到的解决方案是创建一个自定义JsonConverter. 在ReadJson我读取Type属性并通过ToObject<T>函数实例化该类型时。一切正常,直到我使用JsonConverterAttribute. 该ReadJson方法无限循环,因为该属性也应用于子类型。

如何防止将此属性应用于子类型?

[JsonConverter(typeof(TypeSerializer))]
public abstract class Base
{
    private readonly string type;

    public Base(string type)
    {
        this.type = type;
    }

    public string Type { get { return type; } }
}

public class AType : Base
{
    private readonly int height;

    public AType(int height)
        : base("a")
    {
        this.height = …
Run Code Online (Sandbox Code Playgroud)

c# json.net

3
推荐指数
1
解决办法
4558
查看次数

自定义JsonConverter,可以将decimal.MinValue转换为空字符串并返回

我需要为旧系统创建一个自定义JSON.NET转换器,用于标记空小数值...

var nulldec = decimal.MinValue;
Run Code Online (Sandbox Code Playgroud)

(这是在引入可空类型之前创建的,并且改变其工作方式将是大量的工作.)

当这些min值被序列化为JSON时,它们需要被序列化为空字符串.当它们被反序列化时,如果值为空字符串,则需要转换为decimal.MinValue.

这是我到目前为止(是的,不多).我认为这是一个简单的转换,但我没有看到任何文章指出我如何为我的情况工作,也没有任何关于如何创建自定义转换器的文档.有人可以帮忙吗?

public class DecimalJsonConverter : JsonConverter
{
    public override object ReadJson(JsonReader reader, Type objectType, 
                                    object existingValue, JsonSerializer serializer)
    {
    }
    public override void WriteJson(JsonWriter writer, object value, 
                                   JsonSerializer serializer)
    {
    }
    public override bool CanConvert(Type objectType)
    { 
        return typeof(System.Decimal).IsAssignableFrom(objectType); 
    }
}
Run Code Online (Sandbox Code Playgroud)

c# json.net asp.net-mvc-4

3
推荐指数
1
解决办法
2718
查看次数

使用DateTime成员的DeserializeObject不适用于Json.Net

我正在从webrequest中检索一个JSON,我想将其反序列化为以下类:

public class MyData
{
   public int id { get; set; }
   public DateTime openTime { get; set; }
   MyData() {}
}
Run Code Online (Sandbox Code Playgroud)

这是我从服务器收到的JSON:

var json= @"{""Id"": ""12345"",""openTime"":""2015-09-01T12:00:00:000Z""}"
Run Code Online (Sandbox Code Playgroud)

据我所知,这个DateTime字符串是ISO 8601但我不明白为什么最后有三个0毫秒和一个额外的Z.这就是我试图将字符串转换为我的对象的方式:

var responseInstance = JsonConvert.DeserializeObject<MyData>(json,new IsoDateTimeConverter());
Run Code Online (Sandbox Code Playgroud)

这会抛出System.FormatException:String未被识别为有效的DateTime.

当我尝试添加JsonSerializerSetting而不是像这样的IsoDateTimeConverter时:

var deserializeSetting = new JsonSerializerSettings()
{
   DateFormatHandling = DateFormatHandling.IsoDateFormat
};
var responseInstance = JsonConvert.DeserializeObject<MyData>(json,deserializeSetting);
Run Code Online (Sandbox Code Playgroud)

不抛出异常,而是datetime成员始终显示01.01.0001 00:00:00

c# json.net

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

尽管匹配了类成员,NullValueHandling.Ignore会将反序列化影响到[ExtensionData]

我的服务器响应包含一组已知和未知的属性.对于已知的,我创建了一个DTO类,其中包含每个属性的成员.未知属性应放在用[ExtensionData]属性注释的字典中:

[JsonObject(MemberSerialization = MemberSerialization.OptIn)]
public class Dto
{

    [JsonExtensionData]
    private readonly Dictionary<string, object> unknownProperties = new Dictionary<string, object>();

    public IDictionary<string, object> UnknownProperties
    {
        get
        {
            return new ReadOnlyDictionary<string, object>(this.unknownProperties);
        }
    }

    [JsonProperty(Required = Required.Default, PropertyName = "KNOWN_PROPERTY")]
    public string KnownProperty { get; private set; }
}
Run Code Online (Sandbox Code Playgroud)

Null被允许作为值KnownProperty.如果我尝试反序列化包含的JSON对象,如果我配置了序列化程序,则KNOWN_PROPERTY : null该属性也包含在字典中.即使存在以下类成员,也会执行此操作:UnknownPropertiesNullValueHandling.IgnoreKNOWN_PROPERTY

static void Main(string[] args)
{
   string jsonString = @"{
          KNOWN_PROPERTY : null,
          UNKNOWN_PROPERTY : null
   }";

   JsonSerializer serializer = JsonSerializer.CreateDefault(new JsonSerializerSettings() …
Run Code Online (Sandbox Code Playgroud)

c# serialization json.net

3
推荐指数
1
解决办法
1609
查看次数

在转换为 XML 之前更改 JSON 对象中的属性名称

我正在尝试将一些 JSON 转换为 XML,但在此之前我需要更改一些属性才能成功转换。

JSON 结构中的某些属性以数字开头,当我尝试转换为 XML 时,我收到错误消息,因为 XML 不允许以数字开头的标签。

因此,对我有用的一种解决方案是通过向属性添加前缀来更改以数字开头的属性名称。

我一直在尝试做这样的事情:

public string ChangeNumericalPropertyNames(JsonReader reader)
{
    JObject jo = JObject.Load(reader);

    foreach (JProperty jp in jo.Properties())
    {
        if (Regex.IsMatch(jp.Name, @"^\d"))
        {
            string name = "n" + jp.Name; 

            //Logic to set changed name
        }
    }

    return "Here I want to return the entire json string with changed names";
}
Run Code Online (Sandbox Code Playgroud)

当我尝试这个时:

jp.Name = name;
Run Code Online (Sandbox Code Playgroud)

Visual Studio 说这是不可能的,因为它jp.Name是只读的。

有人知道如何实现这个解决方案吗?

c# xml json json.net

3
推荐指数
1
解决办法
4776
查看次数

从JSON响应中删除元素

我有一个JSON字符串,我希望能够删除一些数据.

以下是JSON响应:

{
  "ResponseType": "VirtualBill",
  "Response": {
    "BillHeader": {
      "BillId": "7134",
      "DocumentId": "MN003_0522060",
      "ConversionValue": "1.0000",
      "BillType": "Vndr-Actual",
      "AccountDescription": "0522060MMMDDYY",
      "AccountLastChangeDate": "06/07/2016"
    }
  },
  "Error": null
}
Run Code Online (Sandbox Code Playgroud)

从上面的JSON响应我想删除 "ResponseType": "VirtualBill",部分,使它看起来像这样:

{
  "Response": {
    "BillHeader": {
      "BillId": "7134",
      "DocumentId": "MN003_0522060",
      "ConversionValue": "1.0000",
      "BillType": "Vndr-Actual",
      "AccountDescription": "0522060MMMDDYY",
      "AccountLastChangeDate": "06/07/2016"
    }
  },
  "Error": null
}
Run Code Online (Sandbox Code Playgroud)

有没有一种简单的方法在C#中执行此操作?

c# json

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

从磁盘加载大型json文件时出现内存不足异常

我有一个1.2 GB的json文件,在反序列化时应该给我一个包含15 mil对象的列表.

我正在尝试对其进行反序列化的机器是具有16核和32 GB Ram的Windows 2012服务器(64位).

该应用程序已构建为x64的目标.

尽管如此,当我尝试读取json doc并将其转换为对象列表时,我将失去内存异常.当我看到任务管理器时,我发现只使用了5GB的内存.

我试过的代码如下.

一个.

 string plays_json = File.ReadAllText("D:\\Hun\\enplays.json");

                plays = JsonConvert.DeserializeObject<List<playdata>>(plays_json);
Run Code Online (Sandbox Code Playgroud)

 string plays_json = "";
        using (var reader = new StreamReader("D:\\Hun\\enplays.json"))
        {
            plays_json = reader.ReadToEnd();
            plays = JsonConvert.DeserializeObject<List<playdata>>(plays_json);
        }
Run Code Online (Sandbox Code Playgroud)

C.

 using (StreamReader sr = File.OpenText("D:\\Hun\\enplays.json"))
        {
            StringBuilder sb = new StringBuilder();
            sb.Append(sr.ReadToEnd());
            plays_json = sb.ToString();
            plays = JsonConvert.DeserializeObject<List<playdata>>(plays_json);
        }
Run Code Online (Sandbox Code Playgroud)

所有帮助都是真诚的感谢

c# json json.net

3
推荐指数
1
解决办法
2238
查看次数

使用Json.Net从JSON动态删除字段

我有一些JSON输入,其形状无法预测,并且我必须进行一些转换(称其为某种东西),以便不记录某些字段。例如,如果我有以下JSON:

{
    "id": 5,
    "name": "Peter",
    "password": "some pwd"
}
Run Code Online (Sandbox Code Playgroud)

然后,在转换之后,它应如下所示:

{
    "id": 5,
    "name": "Peter"
}  
Run Code Online (Sandbox Code Playgroud)

上面的示例是微不足道的,但实际情况并非如此。我将有一些正则表达式,如果输入JSON上的任何字段与之匹配,则不应将其放在结果上。如果我有一些嵌套对象,我将必须递归进行。我一直在LINQ to JSON上看到过一些东西,但找不到满足我需求的东西。

有办法吗?

注意:这是日志记录库的一部分。如果有必要或更简单,我可以使用JSON字符串。问题是,在日志记录管道的某个时刻,我得到了对象(或所需的字符串),然后需要从中剥离敏感数据,例如密码,以及其他任何客户端指定的数据。

c# json json.net

3
推荐指数
1
解决办法
1740
查看次数

如何使用 Json.Net 将 JSON 数组反序列化为对象?

我有一个有效的 JSON 对象,其中包含一个 JSON 数组。JSON 数组没有花括号,其中包含一个逗号分隔的混合类型列表。它看起来像这样:

{
    "ID": 17,
    "Days": 979,
    "Start_Date": "10/13/2012",
    "End_Date": "11/12/2012",
    "State": "",
    "Page": 1,
    "Test": "Valid",
    "ROWS": [
        [441210, "A", "12/31/2009", "OK", "Done", "KELLEY and Co'", "12/31/2009", "06/29/2010", "TEXAS", "Lawyers", 6, "", "<img src=\"/includes/images/Icon_done.gif\" border=\"0\" alt=\"Done\" title=\"Done\" />"],
        [441151, "B", "12/31/2009", "No", "In-process", "Sage & Co", "12/31/2009", "06/29/2010", "CALIFORNIA", "Realtor", 6, "", "<img src=\"/includes/images/Icon_InProcess.gif\" border=\"0\" alt=\"In Process\" title=\"In Process\" />"]
    ]
}
Run Code Online (Sandbox Code Playgroud)

我创建了一个类来反映 JSON 结构,其中包含一个用于复杂数组的列表:

class myModel
{
    public int ID { get; set; } …
Run Code Online (Sandbox Code Playgroud)

c# json json.net

3
推荐指数
1
解决办法
1461
查看次数

标签 统计

c# ×10

json.net ×9

json ×5

asp.net-mvc-4 ×1

serialization ×1

xml ×1