【问题标题】:How to provide custom JSON format using Newtonsoft如何使用 Newtonsoft 提供自定义 JSON 格式
【发布时间】:2014-11-12 13:32:03
【问题描述】:

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

生成的 JSON 如下所示:

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

如何将结果更改为:

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

谢谢!

【问题讨论】:

  • 我不熟悉 Newtonsoft,但您想要的结果不是 JSON。 JSON 要么是“键”:“值”对,要么是“键”:“字符串数组”。我希望这会有所帮助...
  • 我验证了结果,我发现这是一个有效的 JSON 格式。

标签: asp.net json linq json.net


【解决方案1】:

您可以简单地从您的 linq 表达式中返回相应的对象类型。

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

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

然后序列化它。

Fiddle

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

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

【讨论】:

    【解决方案2】:

    您必须随意创建自己的 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"
        }
    ]
    

    【讨论】:

    • 非常感谢,我还没有测试你的代码,但我认为这会起作用,你能告诉我,如何将{} 更改为[]?
    • 如果这对您有帮助,您可以接受答案。我不知道你想通过将 {} 更改为 [] 来完成什么。请告诉我你想做什么。
    • 如果我的代码成功了,我会检查你的答案,作为肯定的答案。我使用了一个 jquery 插件,并且应该使用该格式传递 JSON 以使插件工作。
    猜你喜欢
    • 2019-12-25
    • 2014-03-12
    • 1970-01-01
    • 1970-01-01
    • 2015-04-02
    • 2021-08-12
    • 1970-01-01
    • 2021-12-07
    • 1970-01-01
    相关资源
    最近更新 更多