我正在学习C#,我遇到了以下问题.我有两个类:base和derived:
class MyBase
{
public void MyMethod()
{
Console.WriteLine("MyBase::MyMethod()");
}
}
class MyDerived: MyBase
{
public void MyMethod()
{
Console.WriteLine("MyDerived::MyMethod()");
}
}
Run Code Online (Sandbox Code Playgroud)
现在,没有virtual
和override
关键词.当我编译它时,我得到警告(当然是预期的)我试图隐藏MyMethod
在MyBase
课堂上.
我想要做的是从具有派生类实例的基类调用该方法.我是这样做的:
MyDerived myDerived = new MyDerived();
((MyBase)myDerived).MyMethod();
Run Code Online (Sandbox Code Playgroud)
当我没有virtual
在方法中指定任何等关键字时,它工作正常.我试着把关键字组合起来,得到了以下结果:
| MyBase::MyMethod | MyDerived::MyMethod | Result printed on the console |
| -----------------|---------------------|-------------------------------|
| - | - | MyBase::MyMethod() |
| - | new | MyBase::MyMethod() |
| virtual | new | MyBase::MyMethod() |
| virtual | override | …
Run Code Online (Sandbox Code Playgroud) 我有一个对象树,我正在序列化为JSON DataContractJsonSerializer
.Dictionary<TKey, TValue>
得到序列化但我不喜欢标记 - 项目不会像这样呈现:
{key1:value, key2:value2}
Run Code Online (Sandbox Code Playgroud)
而是像一系列序列化KeyValuePair<TKey, TValue>
对象:
[{
"__type":"KeyValuePairOfstringanyType:#System.Collections.Generic",
"key":"key1",
"value":"value1"
},
{
"__type":"KeyValuePairOfstringanyType:#System.Collections.Generic",
"key":"key2",
"value":"value2"
}]
Run Code Online (Sandbox Code Playgroud)
丑,不是吗?
因此,我通过将通用Dictionary包装在实现的自定义对象中来避免这种情况ISerializable
,并且我在GetObjectData
方法中实现了自定义序列化(并且它只需要3行).
现在的问题-我不能让我的类从派生Dictionary<TKey, TValue>
,所以我实现所有的逻辑(Add
,Clear
,等),在我的自定义类,被应用到私人Dictionary<TKey, TValue>
领域.继承会更好,因为在使用我的自定义对象时,我将拥有所有通用字典功能.
继承的问题是它自己的Dictionary<TKey, TValue>
实现ISerializable
,并且DataContractJsonSerializer
似乎更喜欢这个实现,即使我ISerializable
从我的自定义类显式实现,如下所示:
public class MyClass : Dictionary<string, object>, ISerializable
{
public override void GetObjectData(SerializationInfo info,
StreamingContext context)
}
Run Code Online (Sandbox Code Playgroud)
我真的很惊讶这是可能的,因为它允许我实现相同的接口两次而不显然能够使用显式接口实现 - 所以我在一篇关于多接口实现的博客文章中更详细地分析了这种情况
所以,根据我在那里做的实验,序列化器应该调用我的ISerializable实现,无论内部使用什么类型的转换 -
((ISerializable)((Dictionary<,>)obj)).GetObjectData(...)
Run Code Online (Sandbox Code Playgroud)
要么:
((ISerializable)obj).GetObjectData(...)
Run Code Online (Sandbox Code Playgroud)
但它显然没有发生,因为我在生成的JSON中看到KeyValuePair<TKey, TValue> …
.net oop serialization multiple-interface-implem datacontractjsonserializer
我有一个简单的对象图,我想序列化,我无法找到解决这个问题的方法.这里是:
[XmlRoot]
public partial class MyData
{
private List<MyDatum> itemsField;
public MyData()
{
this.anyAttrField = new List<System.Xml.XmlAttribute>();
this.itemsField = new List<MyDatum>();
}
[XmlElement(Type = typeof(MyDatum))]
public List<MyDatum> Items
{
get
{
return this.itemsField;
}
set
{
this.itemsField = value;
}
}
}
Run Code Online (Sandbox Code Playgroud)
这会产生以下XML:
<MyData>
<Items>
<MyDatum/>
<MyDatum/>
...
</items>
</MyData>
Run Code Online (Sandbox Code Playgroud)
我想删除"Items"容器标记来代替:
<MyData>
<MyDatum/>
<MyDatum/>
...
</MyData>
Run Code Online (Sandbox Code Playgroud)
我尝试了各种解决方案,但似乎无法找到解决方案.
我想使用Web API返回camel-cased JSON数据.我继承了一个项目的乱七八糟的项目,使用了以前的程序员目前使用的任何外壳(严重的!所有大写字母,小写字母,pascal-casing和骆驼外壳 - 请你选择!),所以我不能使用这个技巧将它放在WebApiConfig.cs文件中,因为它将破坏现有的API调用:
// Enforce camel-casing for the JSON objects being returned from API calls.
config.Formatters.OfType<JsonMediaTypeFormatter>().First().SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver();
Run Code Online (Sandbox Code Playgroud)
所以我使用的是使用JSON.Net序列化程序的自定义类.这是代码:
using System.Web.Http;
using Newtonsoft.Json;
using Newtonsoft.Json.Serialization;
public class JsonNetApiController : ApiController
{
public string SerializeToJson(object objectToSerialize)
{
var settings = new JsonSerializerSettings
{
ContractResolver = new CamelCasePropertyNamesContractResolver()
};
if (objectToSerialize != null)
{
return JsonConvert.SerializeObject(objectToSerialize, Formatting.None, settings);
}
return string.Empty;
}
}
Run Code Online (Sandbox Code Playgroud)
问题是返回的原始数据如下所示:
"[{\"average\":54,\"group\":\"P\",\"id\":1,\"name\":\"Accounting\"}]"
Run Code Online (Sandbox Code Playgroud)
正如你所看到的,反斜杠搞得一团糟.以下是我使用自定义类调用的方式:
public class Test
{
public double Average { get; set; }
public string …
Run Code Online (Sandbox Code Playgroud) 我目前正在与WPF中的RichTextBoxs中的表进行搏斗.在WPF中,表没有行和列,它们只有行,每行都有一定数量的单元格.当用户按下"添加列"按钮时,我的程序会向每行添加一个新单元格.
使用此方法的问题是在用户添加列之后,如果他们按下撤消,它会逐个删除每个单元格,显然不是用户期望的.
有没有人知道暂时禁用撤消队列添加操作的方法,或者将撤消操作或其他解决方案分组到我的问题的方法?
尝试将类型类的对象添加到JArray时,我收到以下错误.
Could not determine JSON object type for type "Class"
这是我正在使用的代码:
private dynamic _JArray = null
private JArray NArray(Repository repository)
{
_JArray = new JArray();
string[] amounts = repository.Amounts.Split('|');
for (int i = 0; i <= amounts.Length; i++)
{
_JArray.Add(
new AmountModel
{
Amounts = amounts[i],
});
}
return _JArray;
}
public class AmountModel
{
public string Amounts;
}
Run Code Online (Sandbox Code Playgroud)
我在运行程序时将其称为以下内容:
_JArray = NArray(repository);
Console.WriteLine(JsonConvert.SerializeObject(_JArray));
Run Code Online (Sandbox Code Playgroud)
如何在_JArray(JArray)中转换AmountModel(类),以便系统将其识别为JSON对象?
你的回答非常感谢.
谢谢.
我正在将有效的 JSON 对象传递到 .net core 3 Web api 应用程序上的控制器。这样做,我收到错误:
System.NotSupportedException:不支持接口类型的反序列化。输入“OrderTranslationContracts.OrderContracts+IImportOrderLineModel”
所以我查看了我的代码,并得到了以下接口的具体实现。这是我认为引发错误的行:
public List<OrderContracts.IImportOrderLineModel> Lines { get; set; }
Run Code Online (Sandbox Code Playgroud)
以下是我传递到控制器的 JSON 部分:
"lines": [
{
"orderNumber": "LV21131327",
"lineNumber": 1,
"itemId": "3083US",
"customerItemId": "3083US",
"quantity": 3,
"price": 0.00,
"quantityBackOrdered": null,
"comments": "",
"pickLocation": "",
"orderFilled": "O",
"hostUom": null,
"type": null
}
Run Code Online (Sandbox Code Playgroud)
所以我知道 JSON 是有效的。这是控制器的签名:
[HttpPost]
public async Task<List<ImportOrderModel>> Post([FromBody] List<ImportOrderModel> orders)
{
var response = await _validateOrder.ValidateAllOrdersAsync(orders, null);
return response;
}
Run Code Online (Sandbox Code Playgroud)
我什至没有闯入这段代码,因为我假设 JSON 反序列化器在尝试转换它时抛出错误。那么我该如何克服这个错误呢?我受到接口的具体实现的约束,因此我无法更改接口,如果可能的话,我需要使用我这里拥有的接口。如果这是不可能的,是否有任何“解决方法”?
我有一个 json,新System.Text.Json.JsonSerializer.Deserialize<T>(json_data)
序列化为List<T>
正确数量的元素,但是里面的对象的所有值都是 null 或 0
Newtonsoft.Json.JsonConvert.DeserializeObject<T>(json_data)
正确填充了相同的json 。
班级:
public class SensorValue
{
public string StationCode { get; set; }
public string SensorCode { get; set; }
public string SensorNameIt { get; set; }
public string SensorNameDe { get; set; }
public string SensorNameLd { get; set; }
public string SensorUnitMeasure { get; set; }
public DateTime SamplingDateTime { get; set; }
public Decimal SamplingValue { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
JSON
[{"stationCode":"89190MS","sensorCode":"LT","sensorNameIt":"Temperatura dell´aria","sensorNameDe":"Lufttemperatur","sensorNameLd":"Temperatura dl’aria","sensorUnitMeasure":"°C","samplingDateTime":"2019-11-15T15:10:00","samplingValue":0.3},{"stationCode":"89190MS","sensorCode":"N","sensorNameIt":"Precipitazioni","sensorNameDe":"Niederschlag","sensorNameLd":"plueia","sensorUnitMeasure":"mm","samplingDateTime":"2019-11-15T15:10:00","samplingValue":0.4},{"stationCode":"89190MS","sensorCode":"WR","sensorNameIt":"Direzione del vento","sensorNameDe":"Windrichtung","sensorNameLd":"Direzion …
Run Code Online (Sandbox Code Playgroud) System.Text.Json
我正在使用返回对象的.NET Core 命名空间解析一些 JSON 数据JsonElement
。
例如,对于 Int32 类型,JsonElement
有一个GetInt32()
将值作为整数返回,如果不是整数则抛出异常,还有一个TryGetInt32()
将解析后的值复制到out
变量并返回 true 或 false,具体取决于是否它能够正确解析。
这同样适用于几乎所有其他基本类型,但由于某种原因,GetBoolean()
并且GetString()
没有try...
等效项,即使如果无法正确解析值,它们也会抛出异常。
这似乎是一个明显的疏忽,它让我觉得我做错了什么。谁能解释为什么不需要它们?
在迁移到 .NET Core 3 时,我已从 Newtonsoft.Json 序列化切换到 System.Text.Json.Serialization。在我想继续使用 JsonPropertyName 属性的所有功能中。
[JsonProperty(Order = 1)]
public bool Deleted { get; set; }
[JsonProperty(Order = 2)]
public DateTime DeletedDate { get; set; }
Run Code Online (Sandbox Code Playgroud)
有没有办法在 System.Text.Json.Serialization 中实现相同的目标?
c# ×9
json ×6
.net ×1
asp.net-core ×1
asp.net-mvc ×1
base ×1
html ×1
inheritance ×1
json.net ×1
migration ×1
oop ×1
overriding ×1
richtextbox ×1
wpf ×1
xml ×1