我有一个简单的JSON键/值列表,通过POST发送回ASP.NET。例子:

{ "key1": "value1", "key2": "value2"}

我没有试图反序列化为强类型的.NET对象

我只需要一个普通的旧字典(Of String,String),或者一些等价的东西(哈希表,字典(OfString,Object),老式的StringDictionary——见鬼,一个二维字符串数组对我来说很有用。

我可以使用ASP.NET 3.5中可用的任何东西,也可以使用流行的Json.NET(我已经在使用它对客户端进行序列化)。

显然,这两个JSON库都没有这种开箱即用的能力——它们完全专注于通过强契约实现基于反射的反序列化。

有什么想法吗?

限制:

我不想实现我自己的JSON解析器尚无法使用ASP.NET 4.0希望远离旧的、不推荐使用的JSON ASP.NET类


当前回答

令人恼火的是,如果您想使用默认的模型绑定器,看起来您必须使用数字索引值,如表单POST。

请参阅本文的以下摘录http://msdn.microsoft.com/en-us/magazine/hh781022.aspx:

虽然这有点违反直觉,但JSON请求也有相同之处要求他们也必须遵守表单后命名语法。例如,上一个UnitPrice的JSON负载收集此数据的纯JSON数组语法为表示为:[ {“代码”:“USD”,“金额”:100.00},{“代码”:“EUR”,“金额”:73.64}]但是,默认值提供程序和模型绑定程序需要要表示为JSON表单帖子的数据:{“UnitPrice[0].Code”:“USD”,“单价[0]。金额”:100.00,“单价[1].代码”:“EUR”,“单价[1].金额”:73.64}复杂的对象收集场景可能是最复杂的场景之一开发人员遇到的问题广泛的场景,因为语法并不一定对所有开发人员都显而易见。然而,一旦你学习发布复杂集合的相对简单的语法,这些场景变得更容易处理。

其他回答

System.Text.Json

这现在可以使用.NET Core 3.0内置的System.Text.Json来完成。现在可以在不使用第三方库的情况下反序列化JSON。

var json = @"{""key1"":""value1"",""key2"":""value2""}";
var values = JsonSerializer.Deserialize<Dictionary<string, string>>(json);

如果使用.NET标准或.NET Framework,也可以在NuGet包System.Text.Json中获得。


确保阅读并理解:

https://github.com/dotnet/runtime/issues/30452

尝试不使用任何外部JSON实现,所以我这样取消了序列化:

string json = "{\"id\":\"13\", \"value\": true}";

var serializer = new JavaScriptSerializer(); //using System.Web.Script.Serialization;

Dictionary<string, string> values = serializer.Deserialize<Dictionary<string, string>>(json);

我刚刚在RestSharp中实现了这一点。这篇文章对我很有帮助。

除了链接中的代码,这是我的代码。现在,当我这样做时,我会得到一个结果字典:

var jsonClient = new RestClient(url.Host);
jsonClient.AddHandler("application/json", new DynamicJsonDeserializer());
var jsonRequest = new RestRequest(url.Query, Method.GET);
Dictionary<string, dynamic> response = jsonClient.Execute<JObject>(jsonRequest).Data.ToObject<Dictionary<string, dynamic>>();

请注意您期望的JSON类型——在我的例子中,我检索的是一个具有多个财产的单个对象。在所附的链接中,作者正在检索列表。

我建议使用.NET4.5中的System.Runtime.Serialization.Json。

[DataContract]
public class Foo
{
   [DataMember(Name = "data")]
   public Dictionary<string,string> Data { get; set; }
}

然后这样使用:

var serializer = new DataContractJsonSerializer(typeof(List<Foo>));
var jsonParams = @"{""data"": [{""Key"":""foo"",""Value"":""bar""}] }";
var stream = new MemoryStream(Encoding.UTF8.GetBytes(jsonParams));

var obj = serializer.ReadObject(stream);
Console.WriteLine(obj);

根据上面的评论,尝试JsonConvert.DeserializeObject<Dictionary<string,dynamic>(json)

var json = @"{""key1"":1,""key2"":""value2"", ""object1"":{""property1"":""value1"",""property2"":[2,3,4,5,6,7]}}";
var parsedObject = JsonConvert.DeserializeObject<Dictionary<string,dynamic>>(json);

似乎甚至适用于复杂的对象和列表。