简单的json检索

时间:2018-12-31 12:33:10

标签: c# json dictionary

我知道这是一个古老的栗子,但是我想这样做 而不导入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"]的最精简,最肿的方法是什么?它只会返回一件事...如果我必须走绳走,我会,但不应该那么难

4 个答案:

答案 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的应用程序提供序列化和反序列化功能。

source

答案 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());
        }
    }
}