Newtonsoft.Json用下划线替换空格C#到JSON Serialize

时间:2017-12-01 08:58:39

标签: c# json entity-framework serialization

初步问题:

这里我有一个用于从Entity Framework对象转换为JSON的函数:

public class JSON
{
    public static string ConvertEntityToJSON(object dataToSerialize)
    {
        return JsonConvert.SerializeObject(dataToSerialize,
            new JsonSerializerSettings
            {
                ReferenceLoopHandling = ReferenceLoopHandling.Ignore
            });
    }
}

调试时," dataToSerialize"看起来如下:

SELECT 
[xxx].[Firstattributefromdatabase] AS [First attribute from database], 
[xxx].[Secondattributefromdatabase] AS [Second attribute from database]
FROM [xxx]

因此可见,SQL中的属性名称中的单词之间有空格,而不是下划线,但输出(表格中的一行)如下所示:

[{"First_attribute_from_database":"xxx","Second_attribute_from_database":"xxx"}]

可能导致此问题的任何线索以及如何解决这个问题?我将这个JSON数据加载到数据透视表中,这会导致所有字段都有下划线而不是单词之间的空格。

更新1:

好的,所以在查看使用Entity Framework从数据库生成的内容(来自数据库的EF设计器;数据库优先方法)之后,生成的类如下:

public partial class TestClass
{
    public string First_attribute_from_database { get; set; }
    public string Second_attribute_from_database { get; set; }
}

即使在MS SQL Server Management Studio中明确定义了这是一个VIEW(不是表本身),并且SQL的格式如下:

SELECT 
[xxx].[Firstattributefromdatabase] AS [First attribute from database], 
[xxx].[Secondattributefromdatabase] AS [Second attribute from database]
FROM [xxx]

所以问题出现了:如何克服下划线问题,因为C#属性的名称中不能有空格?

1 个答案:

答案 0 :(得分:3)

问题已解决:

在此期间找到GetBoundsRect。在那之后我刚刚从文章中实现了函数,在ResolvePropertyName中修改了替换,瞧,我的代码工作得非常好!希望这可以帮助所有使用Entity Framework的人,从数据库生成模型并尝试从C#对象转到JSON。

public class JSON
{
    public static string ConvertEntityToJSON(object dataToSerialize)
    {
        return JsonConvert.SerializeObject(dataToSerialize,
            new JsonSerializerSettings
            {
                ReferenceLoopHandling = ReferenceLoopHandling.Ignore,
                NullValueHandling = NullValueHandling.Ignore,
                ContractResolver = new UnderscorePropertyNamesContractResolver()
            });
    }
}

public class UnderscorePropertyNamesContractResolver : DefaultContractResolver
{
    public UnderscorePropertyNamesContractResolver() : base()
    {
    }

    protected override string ResolvePropertyName(string propertyName)
    {
        return Regex.Replace(propertyName, "_", " ");
    }
}