相关疑难解决方法(0)

自定义JsonConverter(Web API)中的Json.Net JsonSerializer中的自引用循环

该项目是Asp.Net Web API Web服务.

我有一个类型层次结构,我需要能够序列化到JSON和从JSON序列化,所以我从这个SO中获取代码:如何在JSON.NET中实现自定义JsonConverter来反序列化基类对象的列表?,并将转换器应用于我的层次结构的基类; 像这样的东西(这里有伪代码隐藏无关紧要):

[JsonConverter(typeof(TheConverter))]
public class BaseType
{
    // note the base of this type here is from the linked SO above
    private class TheConverter : JsonCreationConverter<BaseType>
    {
        protected override BaseType Create(Type objectType, JObject jObject)
        {
            Type actualType = GetTypeFromjObject(jObject); /*method elided*/
            return (BaseType)Activator.CreateInstance(actualType);
        }
    }
}

public class RootType
{
    public BaseType BaseTypeMember { get; set; }
}

public class DerivedType : BaseType
{

}
Run Code Online (Sandbox Code Playgroud)

所以,如果我反序列化RootType实例,其BaseTypeMember等于实例DerivedType,然后将它反序列化回到该类型的实例.

对于记录,这些JSON对象包含一个'$type' …

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

39
推荐指数
2
解决办法
2万
查看次数

我可以使用Json.net在一次操作中将嵌套属性序列化到我的类中吗?

可以说我有一个模型:

public class MyModel
{
    public string Name { get; set; }
    public string[] Size { get; set; }
    public string Weight { get; set; }

}
Run Code Online (Sandbox Code Playgroud)

和Json这样:

{
    "name" : "widget",
    "details" : {
        "size" : [
            "XL","M","S",
        ]
        "weight" : "heavy"
    }
}
Run Code Online (Sandbox Code Playgroud)

我一直试图找到一种方法来序列化我的对象,而不是为"名称"创建一个模型,为"细节"创建一个模型,因为这不能很好地映射到我的数据库,所以需要一点点玩杂耍来填充类.

我可以在JsonConvert.PopulateObject()上进行多次传递,如:

var mod = new MyModel();

JsonConvert.PopulateObject(json.ToString(), mod);
JsonConvert.PopulateObject(json["details"].ToString(), mod);
Run Code Online (Sandbox Code Playgroud)

但在我的真实代码中,我运行多个线程,PopulateObject不是线程安全的,它会阻塞应用程序.PopulateJsonAsync()的注释表示不使用它,而是在PopulateObject()上使用Task.Run().

这不起作用,当我调用它时仍然锁定应用程序:

await Task.Run(() => JsonConvert.PopulateObject(response.ToString(), productDetail));

if (response["results"].HasValues)
{
    await Task.Run(() => JsonConvert.PopulateObject(response["results"][0].ToString(), productDetail));
}
Run Code Online (Sandbox Code Playgroud)

一些人通过,但最终应用程序完全线程锁定.如果我删除PopulateObject线程都终止正常,所以我很确定这个函数不是线程安全的.

是否有一个简洁的线程安全的方法来一步填充我的对象?

c# multithreading json.net

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

如何将json对象反序列化为特定的子类?

我有一个 Cabin 类,其中包含 Row 对象的列表。我想像这样序列化对象,但是在反序列化时,我希望 Row 对象成为 RowRule 对象,它继承自 Row 对象。下面是我一直在尝试的一些示例代码。

class Program
{
    static void Main(string[] args)
    {
        var cabin = new Cabin();
        var row = new Row();
        row.Status = "Success";
        cabin.Rows = new List<Row>()
        {
            row,
            row
        };

        JsonSerializerSettings settings = new JsonSerializerSettings()
        {
            TypeNameHandling = TypeNameHandling.Auto
        };
        string json = JsonConvert.SerializeObject(cabin, Formatting.Indented, settings);
        Console.WriteLine(json);

        Cabin obj = JsonConvert.DeserializeObject<Cabin>(json,
            new JsonSerializerSettings() {TypeNameHandling = TypeNameHandling.Auto});
        Console.WriteLine(obj);
        Debug.Assert(obj.Rows.First().GetType().Name == "RowRule");
    }
}

class Cabin
{
    public IList<Row> Rows { get; …
Run Code Online (Sandbox Code Playgroud)

c# json deserialization

2
推荐指数
1
解决办法
2039
查看次数