美好的一天!
我目前通过以下代码使用Newtonsoft Json Serializer:
private string serializeAndIgnoreEmail(UserMembership obj)
{
var json = JsonConvert.SerializeObject(obj, Formatting.Indented,
new JsonSerializerSettings() { ContractResolver = new DocumentIdContractResolver() });
return json;
}
private class DocumentIdContractResolver : CamelCasePropertyNamesContractResolver
{
protected override List<MemberInfo> GetSerializableMembers(Type objectType)
{
return base.GetSerializableMembers(objectType).Where(o => o.Name != "Email").ToList();
}
}
Run Code Online (Sandbox Code Playgroud)
每次我需要序列化一个对象时,我都会调用'serializeAndIgnoreEmail'方法.我现在想用它的加密版本替换每个属性的内容,我不知道在哪里这样做.
我的猜测是覆盖'DocumentIdContractResolver'中的一个方法,但是有很多CreateBlahBlahBlah,我觉得很难使用它们.
这是正确的方法,继续修改ContractResolver还是我应该尝试别的?
谢谢!
我有一个类,FooCollection比方说,它实现了IEnumerable<Foo>,并且还提供了一个索引器,通过它可以Foo按名称查找a .在功能上它只是字典的只读.但它并不是真正的字典,因为用户无法决定密钥.
无论如何,我希望JSON.NET将此对象序列化为JSON字典,而不是现在正在执行的数组.坚持JsonDictionaryAttribute它不起作用:然后它什么都不做.
线索?
我有一个 ActionResult 方法,它接受列表作为参数:
[HttpPost]
public ActionResult MyMethod (List<ClassA> json)
{
...
}
Run Code Online (Sandbox Code Playgroud)
这会将传入的 json 字符串绑定到已填充的 ClassA 对象的通用列表。
问题是有时传入的 json 只是一个 json 对象,而不是 json 对象数组。
有什么方法可以抢占这个,这样我就可以直接绑定到 ClassA 与 List 吗?或者我可以使用其他一些技术吗?
以下是 JSON 的发送方式(作为数组):
var myjsonarray = [{
"ID": "1",
"FirstName": "John",
"LastName": "Doe",
}, {
"ID": "2",
"FirstName": "Jane",
"LastName": "Doe",
}];
$.ajax({
type: "POST",
contentType: "application/json; charset=utf-8",
url: "/Home/MyPage",
data: JSON.stringify(myjsonarray),
dataType: 'json'
});
Run Code Online (Sandbox Code Playgroud)
以上处理没问题。这也有效:
var myjsonarray = [{
"ID": "1",
"FirstName": "John",
"LastName": "Doe",
}];
Run Code Online (Sandbox Code Playgroud)
但是当我作为未包装在数组中的单个对象发送时:
var myjsonarray = …Run Code Online (Sandbox Code Playgroud) 所以,我正在使用Web API控制器来接受JSON请求.它映射到包含枚举列表的模型对象.我遇到的问题是,如果JSON包含无效值,它似乎没有正确反序列化.我希望无效值可以映射到我的枚举列表中的0值类型,但是没有发生.
我已经分离出3个主要案例:如果JSON的形式是
...
"MyEnumList":["IncorrectEnum", "One", "Two"]
...
Run Code Online (Sandbox Code Playgroud)
该值根本没有映射,我只是得到一个包含两个有效值的列表.但是,如果我提供这个JSON:
...
"MyEnumList":["123", "One", "Two"]
...
Run Code Online (Sandbox Code Playgroud)
我得到一个包含3个对象的列表,其中第一个对象的类型为"MyEnum",其值为123,即使在我的枚举中没有定义.如果我提供此JSON语法,也会发生同样的情况:
...
"MyEnumList":[123, "One", "Two"]
...
Run Code Online (Sandbox Code Playgroud)
任何人都可以解释这里发生了什么,以及如何确保值始终映射到有效类型?
供参考,模型对象,包含我的枚举列表:
public class MyClass
{
public List<myEnum> MyEnumList { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
和简单的枚举:
public enum myEnum
{
Zero = 0,
One = 1,
Two = 2
}
Run Code Online (Sandbox Code Playgroud) 请为我澄清一些困惑:我有一个 JSON 字符串,我试图将它粘贴到一个对象中,但我只想接收顶层,并将下面的所有内容视为 blob 或字符串。像这样的东西。
这是我的模型:
public class InputJson
{
[JsonProperty(PropertyName = "signals")]
public string signals{ get; set; }
[JsonProperty(PropertyName = "options")]
public string options { get; set; }
[JsonProperty(PropertyName = "fields")]
public string fields{ get; set; }
[JsonProperty(PropertyName = "lapse")]
public string lapse{ get; set; }
}
Run Code Online (Sandbox Code Playgroud)
我正在尝试将 JSON 字符串(见下文)反序列化,如下所示:
InputJson a = JsonConvert.DeserializeObject<InputJson>(body);
Run Code Online (Sandbox Code Playgroud)
我希望这 a.signals会返回一个字符串,所有内容都在“信号”下方和“选项”之前,但它失败了,因为它试图继续并序列化其下方的所有内容。我得到一个JsonReaderException:
读取字符串时出错。意外标记:StartArray。路径“信号”,第 1 行,位置 12。
我尝试玩弄JsonSerializerSettings(例如将 maxDepth 设置为 1),但没有任何帮助。任何人?
我的 JSON 字符串:
{
"signals":
[
{
"name":"1",
"att1":"44",
"att2":"0", …Run Code Online (Sandbox Code Playgroud) 大家好我的json serealization问题.我在Unity下使用Json.NET包:我正在搜索一个数据库,可以在我的应用程序上编辑,并通过wwwForm和一个php文件存储在我的服务器上.我没有问题来创建它并将其推到网上.问题是,当我加载它时,数据库最后有一个新条目.数据库类是这样的:
public class Database {
public List<Army> armies { get; set;}
public Database() {
armies = new List<Army>();
armies.Add (new Army());
}
}
public class Army
{
public string faction { get; set;}
public List<Unit> army { get; set;}
public Army()
{
faction = "RED";
army = new List<Unit>();
army.Add (new Unit());
}
}
public class Unit
{
public string name { get; set;}
public float fissionTimer { get; set;}
public float HP { get; set;}
public int shield …Run Code Online (Sandbox Code Playgroud) 我在使用json.net序列化数据时遇到了一个奇怪的问题.主要是,我试图将传出的json中的"Key"和"Value"名称重命名为更具描述性的名称.具体来说,我希望将与IRequest相关的"Key"称为"Request",将IQuoteTimeSeries的"Value"称为"DataSeries"
请注意,这不会反序列化.它仅用于网页上的数据分析.
我正在序列化的数据存储库对象是一个Dictionary<IRequest, IQuoteTimeSeries>对象.IRequest表示对数据的特定请求,IQuoteTimeSeries是包含返回数据的对象SortedDictionary<DateTime, IQuote>.这是按时间戳排序的一系列数据.在这个例子中,为了简洁起见,我只在TimeSeries中有一个项目,但在大多数情况下会有很多项目.
所有内容都需要组织在一起,序列化并发送给JavaScript使用.
这是这些对象的基本代码;
[JsonArray]
public class QuoteRepository : Dictionary<IRequest, IQuoteTimeSeries>, IQuoteRepository
{
public QuoteRepository() { }
public void AddRequest(IRequest request)
{
if (!this.ContainsKey(request))
{
IQuoteTimeSeries tSeries = new QuoteTimeSeries(request);
this.Add(request, tSeries);
}
}
public void AddQuote(IRequest request, IQuote quote)
{
if (!this.ContainsKey(request))
{
QuoteTimeSeries tSeries = new QuoteTimeSeries(request);
this.Add(request, tSeries);
}
this[request].AddQuote(quote);
}
IEnumerator<IQuoteTimeSeries> Enumerable<IQuoteTimeSeries>.GetEnumerator()
{
return this.Values.GetEnumerator();
}
}
Run Code Online (Sandbox Code Playgroud)
报价时间序列看起来像这样;
[JsonArray]
public class QuoteTimeSeries: SortedDictionary<DateTime, IQuote>, IQuoteTimeSeries
{
public QuoteTimeSeries(IRequest request) …Run Code Online (Sandbox Code Playgroud) 我正在构建一个Web API,并且对的JSON序列化遇到了麻烦DateTimes。经过一些测试之后,我只能得出结论,Newtonsoft.Json.JsonConvert和/或Newtonsoft 的行为IsoDateTimeConverter不是我所期望的。
考虑一下:
// Arrange
var noonUtc = new DateTime(2016, 05, 12, 12, 0, 0, DateTimeKind.Utc);
var noon = new DateTime(2016, 05, 12, 12, 0, 0, DateTimeKind.Unspecified);
var settings = new JsonSerializerSettings();
settings.Converters.Add(new IsoDateTimeConverter
{
Culture = CultureInfo.InvariantCulture,
DateTimeStyles = DateTimeStyles.AdjustToUniversal
});
// Act
var utcJson = JsonConvert.SerializeObject(noonUtc, settings); // "\"2016-05-12T12:00:00Z\""
var json = JsonConvert.SerializeObject(noon, settings); // "\"2016-05-12T10:00:00Z\""
... // Assertions
Run Code Online (Sandbox Code Playgroud)
好的,所以DateTimewith 的时间DateTimeKind.Unspecified已从12点调整为10点。我现在在斯德哥尔摩,比世界协调时间早两个小时,真是太公平了。
但是,让我们将序列化程序设置更改为use DateTimeStyles.AssumeUniversal,如下所示:
settings.Converters.Add(new IsoDateTimeConverter
{ …Run Code Online (Sandbox Code Playgroud) 使用Json.net(Newtonsoft.json),我如何定义一个C#类(或类)来处理下面的json?
"数据"字段似乎是级别/描述子字段的列表,但请注意它们之前没有字段名称.
"错误"字段似乎是错误编号/错误消息子字段的列表,但请注意,它们也不以字段名称开头.
{
"status": "error",
"data": [
{
"warning" : "your input was wrong"
}
],
"error": [
{
"373": "Error description goes here"
}
]
}
Run Code Online (Sandbox Code Playgroud)
此类定义不会生成解析错误; 但是数据和错误的内容不正确.
public class ApiResponse
{
[JsonProperty(PropertyName = "status")]
public string Status;
[JsonProperty(PropertyName = "data")]
public IEnumerable<KeyValuePair<string, string>> Data;
[JsonProperty(PropertyName = "error")]
public IEnumerable<KeyValuePair<int, string>> Errors;
};
// this doesn't throw a parsing exception, but the resulting
// Data and Errors fields are not correctly populated.
var x …Run Code Online (Sandbox Code Playgroud) 当尝试使用 更新类属性时,不会JsonConvert.PopulateObject调用JsonPathConverter,因此填充不会完成。
示例类:
[JsonConverter(typeof(JsonPathConverter))]
public class SampleClass
{
int id;
[JsonProperty("sample.id")]
public int Id
{
get
{
return id;
}
set
{
id = value;
}
}
}
Run Code Online (Sandbox Code Playgroud)
拨电至PopulateObject:
var sampleClass = new SampleClass() {
Id = 1
};
var str = "{sample:{id:2}}";
JsonConvert.PopulateObject(str, sampleClass, new JsonSerializerSettings());
Run Code Online (Sandbox Code Playgroud)
但该Id属性永远不会设置为 2。
我已经尝试JsonSerializerSettings过,converter = new JsonPathConverter()但它也不起作用。
知道为什么它不起作用吗?