如何使用Newtonsoft提供自定义JSON格式

时间:2014-11-12 13:32:03

标签: asp.net json linq json.net

我使用Newtonsoft库将LINQ结果转换为JSON格式。

生成的JSON如下所示:

[{"title":"Some title", "Score":1000}, {"title":"Some title", "Score":2000}]

如何将结果更改为:

 [["Some title", 1000], ["Some title", 2000]]

谢谢!

2 个答案:

答案 0 :(得分:3)

您只需从linq表达式中返回相应的对象类型。

在您的LINQ查询中,添加此转换:

var myNewQuery = myQuery.Select( x => new ArrayList{ x.title, x.Score } );

然后将其序列化。

Fiddle

一点点解释:你想要的输出是一个数组数组,每个内部数组都有两个元素,但类型不同。 C#通用列表不允许这样做,但您可以始终使用List<object>或仅使用无类型ArrayList作为内部数组。然后让Json.NET做它的事情并将所有集合(打字或无类型)序列化为[...]。

值得注意的是,自定义JsonConverter的答案可能具有更好的性能,如果您有极高的吞吐量,我建议您这样做。

答案 1 :(得分:1)

您必须创建自己的JsonConverter并随意使用一些有效的json逻辑覆盖WriteJson方法。

public class SomeJsonConverter : JsonConverter
{

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {

        JObject result = new JObject();
        SomeModel model = (SomeModel)value;
        //create result as you want
        //get JToken.FromObject(model.property) - if you want to get some property from model
        result.WriteTo(writer);
    }
}

你会像这样使用它:

 JsonConvert.SerializeObject(serializableModel, Formatting.None, new SomeJsonConverter()));
 //serializableModel has SomeModel type

您可以在此处检查您的json的有效性:http://jsonlint.com/

您必须存储以下内容:

  [
    {
        "Some title": "1000"
    },
    {
        "Some title": "2000"
    }
]

如果将{}更改为[]意味着要创建另一种对象,则必须看到:

json对象如下所示:

  {
    "glossary": {
        "title": "example glossary",
        "GlossDiv": {
            "title": "S",
            "GlossList": {
                "GlossEntry": {
                    "ID": "SGML",
                    "SortAs": "SGML",
                    "GlossTerm": "Standard Generalized Markup Language",
                    "Acronym": "SGML",
                    "Abbrev": "ISO 8879:1986",
                    "GlossDef": {
                        "para": "A meta-markup language, used to create markup languages such as DocBook.",
                        "GlossSeeAlso": ["GML", "XML"]
                    },
                    "GlossSee": "markup"
                }
            }
        }
    }
}

这里有一个对象数组:

[
    {
        "item": "Xylophone"
    },
    {
        "item": "Carrot"
    },
    {
        "item": "Apple"
    }
]