高级JSON序列化格式选项

时间:2012-09-11 10:48:06

标签: c# json serialization json.net

我在列表对象中有一些对象形式的数据。现在我想将这些数据序列化为JSON。为此,我(目前)使用JSON.NET。我的问题是用

JsonConvert.SerializeObject(list, ...)

我似乎只能选择缩进整个内容,也就是每个键/值,或者根本不缩进。

{"Variable1":1,"Variable2":"2"},{"Variable1":1,"Variable2":"2"},...

or

{
    "Variable1": 1,
    "Variable2": "2"
},
{
    "Variable1": 1,
    "Variable2": "2"
},
...

我想得到这个:

{ "Variable1": 1, "Variable2": "2" },
{ "Variable1": 1, "Variable2": "2" },

但无需自己显式写入每个键/值(JsonTextWriter或手动)。我只想通过列表并获得上述内容。这有点可能吗?目前,我将每个对象分开,通过列表,运行一些替换,正则表达式替换等,以获得所需的输出,具体取决于输入列表。有没有更简单的方法来做这个,而不编写自己的序列化方法?

1 个答案:

答案 0 :(得分:0)

你好,我找到了一些帮助你启动特殊格式化程序的东西 我从这里将它从javascript翻译成c#:https://github.com/umbrae/jsonlintdotcom/blob/master/c/js/jsl.format.js

它将空格添加到没有它们的json字符串。 我认为您可以根据自己的需要修改此格式化程序。

private static string PrettyPrinter_repeat(string s, int count) {
    string ns = "";

    for(int i = 0; i < count; i++) ns += s;
    return ns;
}

public static string PrettyPrinter(string json)
{
    int     i           = 0,
            il          = 0;

    string  tab         = "    ",
            newJson     = "";

    int     indentLevel = 0;
    bool    inString    = false;
    char    currentChar = default(char);


     for (i = 0, il = json.Length; i < il; i += 1) 
     {
        currentChar = json[i];

        switch (currentChar) {
        case '{': 
        case '[': 
            if (!inString) { 
                newJson += currentChar + "\n" + PrettyPrinter_repeat(tab, indentLevel + 1);
                indentLevel += 1; 
            } else { 
                newJson += currentChar; 
            }
            break; 
        case '}': 
        case ']': 
            if (!inString) { 
                indentLevel -= 1; 
                newJson += "\n" + PrettyPrinter_repeat(tab, indentLevel) + currentChar; 
            } else { 
                newJson += currentChar; 
            } 
            break; 

        case ',': 
            if (!inString) { 
                newJson += ",\n" + PrettyPrinter_repeat(tab, indentLevel); 
            } else { 
                newJson += currentChar; 
            } 
            break; 
        case ':': 
            if (!inString) { 
                newJson += ": "; 
            } else { 
                newJson += currentChar; 
            } 
            break; 
        case ' ':
        case '\n':
        case '\t':
            if (inString) {
                newJson += currentChar;
            }
            break;
        case '"': 
            if (i > 0 && json[i - 1] != '\\') {
                inString = !inString; 
            }
            newJson += currentChar; 
            break;
        default: 
            newJson += currentChar; 
            break;                    
        } 



     }

    return newJson; 


}