我知道这是一个古老的栗子,但是我想这样做 而不导入newton-soft或json.net
我知道这应该起作用
这是json:
{ "do": "Thing", "with": "abc" }
从字面上看就是这样。我需要将其放入C#地域
这是我到目前为止所拥有的
var json = wc.DownloadString("url");
Console.WriteLine("GOT >> " + json); //says GOT >> { "do": "Thing", "with": "abc" }
var sJson = new JavaScriptSerializer();
var data = sJson.Deserialize<Dictionary<string, string>[]>(json); //crashes with No parameterless constructor defined for type of 'System.Collections.Generic.Dictionary
从单行json中获得data["do"]
和data["with"]
的最精简,最肿的方法是什么?它只会返回一件事...如果我必须走绳走,我会,但不应该那么难
答案 0 :(得分:3)
您的JSON中没有数组,只有一个简单的对象,因此可以将其反序列化为单个Dictionary
实例。只需将Dictionary<string, string>[]
更改为Dictionary<string, string>
。像这样:
var data = sJson.Deserialize<Dictionary<string, string>>(json);
然后您可以像这样访问您的值:
data["do"] // returns "Thing"
data["with"] // returns "abc"
答案 1 :(得分:3)
您可以为数据创建一个支持类
public class Data {
public string do { get; set; }
public string with { get; set; }
}
然后简单地对其进行脱盐
var data = sJson.Deserialize<Data>(json);
如果提供的数据实际上是一个数组,则相应地更新通用返回类型
答案 2 :(得分:0)
数组有问题。试试这个(Try it Online!):
var json = "{ \"do\": \"Thing\", \"with\": \"abc\" }";
var data = JsonConvert.DeserializeObject<Dictionary<string, string>>(json);
Console.WriteLine(data["do"]);
Console.WriteLine(data["with"]);
输出
Thing
abc
请注意,我正在按照文档中的说明在此处使用Json.NET:
Json.NET应该用于序列化和反序列化。为启用AJAX的应用程序提供序列化和反序列化功能。
答案 3 :(得分:-1)
您可以使用正则表达式:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
string input = "{ \"do\": \"Thing\", \"with\": \"abc\" }";
string pattern = "\"(?'key'[^\"]+)\":\\s+\"(?'value'[^\"]+)";
MatchCollection matches = Regex.Matches(input, pattern);
Dictionary<string, string> dict = matches.Cast<Match>()
.GroupBy(x => x.Groups["key"].Value, y => y.Groups["value"].Value)
.ToDictionary(x => x.Key, y => y.FirstOrDefault());
}
}
}