小编Bri*_*ers的帖子

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

如何在 JsonConverter 中将数组转换为对象

我想通过使用JsonConverter. 例如,我有一个这样的属性[{"Name":"aaa"}]。序列化后我想要这样的结果{"__po":"Add",Objects:[{"Name":"aaa"}]}

所以我创建了一个用于自定义序列化程序的类:

public class Serializer : ISerializer
{
    public JsonSerializerSettings SerializerSettings { get; set; }

    public Serializer()
    {
        SerializerSettings = new JsonSerializerSettings();
        SerializerSettings.Converters.Add(new ParseArrayToObjectJsonConverter());
    }

    public class ParseArrayToObjectJsonConverter : JsonConverter
    {
        public override bool CanConvert(Type objectType)
        {
            if (objectType.GetTypeInfo().Name.EndsWith("Array"))
            {
                return true;
            }
            return false;
        }

        public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
        {

        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我看到JsonWriter有这个属性public WriteState WriteState { get; }可以返回一个像这样的枚举:public enum WriteState { …

.net serialization json.net

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

在Web API中将包含JToken的对象序列化为XML时的循环引用异常

在我的数据库中,我有一个包含许多列的表,其中一个包含一个JSON字符串(我无法控制它).像这样的东西:

Name  Age  ExtraData
----  ---  ------------------
Bob    31  {c1: "1", c2: "2"}   <-- string with JSON
Run Code Online (Sandbox Code Playgroud)

我的Web API端点必须根据请求中的Accept标头返回XML或JSON.像这样的东西:

JSON:

{
  "Name": "Bob",
  "Age": 31,
  "ExtraData": {
    "c1": 1,
    "c2": 2
  }
}
Run Code Online (Sandbox Code Playgroud)

XML:

<person>
  <Name>Bob</Name>
  <Age>31</Age>
  <ExtraData>
    <c1>1</c1>
    <c2>2</c2>
  </ExtraData>
</person>
Run Code Online (Sandbox Code Playgroud)

为此,我在C#中创建了一个类,如下所示:

public class Person
{
    public string Name { get; set; }
    public int Age { get; set; }
    public Object ExtraData { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

从数据库解析数据时,我将填写ExtraData如下:

personInstance.ExtraData = JsonConvert.DeserializeObject(personTableRow.ExtraData);
Run Code Online (Sandbox Code Playgroud)

当Web API返回JSON时,所有工作都按预期工作.

当Web API返回XML时,它会给出一个异常:

'ObjectContent`1'类型无法序列化内容类型'application/xml的响应主体; …

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

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

当前几个 JSON 项具有非十进制值时,将动态 JSON 反序列化为 DataTable 会丢失小数

我正在尝试使用 Json.Net 将一些动态创建的 JSON 反序列化为数据表,结果表没有预期的十进制值。

string data = @"[
    {""RowNumber"":1,""ID"":4289,""Assets Variance"":100,""Rules Diff"":10.72,""TotalFunding"":0},
    {""RowNumber"":2,""ID"":4233,""Assets Variance"":75,""Rules Diff"":6.7,""TotalFunding"":0},
    {""RowNumber"":3,""ID"":2222,""Assets Variance"":43,""Rules Diff"":6.7,""TotalFunding"":43.22}
]";

DataTable dt = JsonConvert.DeserializeObject<DataTable>(data);
Run Code Online (Sandbox Code Playgroud)

如果您查看此 JSON 中的前两项,则该属性Total Funding具有值0,第三项具有值,43.22但是当我们将其转换为数据表时,它将呈现为43. 属性不会发生这种情况,Rules Diff因为它在第一个项目本身中具有有效的十进制值。

JSON 中的属性是动态的,因此不能针对特定类型进行转换。我们如何反序列化这个 JSON 以便它在数据表中保留小数?

c# datatable json json.net

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

C# 通过多级数组仅根据Key名称查找JSON值

我有各种输入 JSON 格式的数据,它们都包含特定的 key-name terminalSize。这是我唯一知道的作品。JSON 树的总数或terminalSizeJSON 树内部的确切深度将永远是未知的,并且可能会发生变化。

我正在寻找一个 C# 解决方案来循环遍历 JSON 字符串的每个子级并查找terminalSize然后获取值。

我已经成功尝试过此操作,但只有terminalSize在 JSON 的第一级时它才有效:

var list = JsonConvert.DeserializeObject<List<Dictionary<string, string>>>(jsonString);
var dict = list.SelectMany(d => d).ToDictionary(p => p.Key, p => p.Value);
var terminal = dict["terminalSize"];
Run Code Online (Sandbox Code Playgroud)

示例 1。

{
  "status": "success",
  "data": {
    "terminalSize": 3766505.46,
    "totalTerminalSize": 3766505.46
  },
  "message": null
}
Run Code Online (Sandbox Code Playgroud)

示例 2.

{
  "lastUpdated": 1588020678,
  "terminalData": {
    "terminalSize": "451679852",
    "totalTerminalSize": "2100000000"
  },
  "terminalValueSeries": {
    "8x7": 2.33,
    "8x6": 3.73,
    "8x5": 4.49,
    "8x4": 3.68,
    "8x3": …
Run Code Online (Sandbox Code Playgroud)

c# linq json json.net

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

标签 统计

c# ×9

json.net ×9

json ×7

serialization ×2

xml ×2

.net ×1

asp.net-web-api ×1

datatable ×1

linq ×1