小编Bri*_*ers的帖子

Json .NET序列化 - 更改属性值

美好的一天!

我目前通过以下代码使用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还是我应该尝试别的?

谢谢!

c# json json.net

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

如何将集合(带有索引器属性)序列化为字典

我有一个类,FooCollection比方说,它实现了IEnumerable<Foo>,并且还提供了一个索引器,通过它可以Foo按名称查找a .在功能上它只是字典的只读.但它并不是真正的字典,因为用户无法决定密钥.

无论如何,我希望JSON.NET将此对象序列化为JSON字典,而不是现在正在执行的数组.坚持JsonDictionaryAttribute它不起作用:然后它什么都不做.

线索?

c# json.net

5
推荐指数
1
解决办法
7206
查看次数

如何使用相同的 MVC 控制器方法处理数组或单个对象?

我有一个 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)

c# json asp.net-mvc-4

5
推荐指数
1
解决办法
1704
查看次数

Web Api错误地反序列化枚举列表

所以,我正在使用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)

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

5
推荐指数
1
解决办法
3699
查看次数

json 字符串的部分序列化:仅采用 JSON.NET 的顶级

请为我澄清一些困惑:我有一个 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)

c# serialization json json.net

5
推荐指数
1
解决办法
4170
查看次数

重复序列化和反序列化会创建重复项

大家好我的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)

c# serialization json json.net unity-game-engine

5
推荐指数
1
解决办法
2407
查看次数

使用JSON.NET序列化复杂词典时,更改"键"和"值"的名称

我在使用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)

c# serialization json json.net

5
推荐指数
1
解决办法
3215
查看次数

为什么在使用DateTimeStyles.AssumeUniversal时,JsonConvert用DateTimeKind.Unspecified更改DateTimes的时间?

我正在构建一个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)

datetime json.net

5
推荐指数
1
解决办法
753
查看次数

JSON到C# - 在json中列出没有子字段名称的字段?

使用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)

c# json json.net deserialization

5
推荐指数
1
解决办法
964
查看次数

JsonConvert.PopulateObject 不使用 JsonConverter 类属性

当尝试使用 更新类属性时,不会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()但它也不起作用。

知道为什么它不起作用吗?

c# json.net deserialization

5
推荐指数
1
解决办法
1539
查看次数