在C#中从JSON中读取特定值

时间:2017-01-23 14:29:13

标签: c# .net json json-deserialization

所以我有一个JSON字符串,我只想读取一个特定的值。如何从下面的字符串中选择“Read me please!”?

var readString = /*Read me please!*/

JSON字符串:

"{\"aString\":\"Read me please!\"}"

为了更好地理解,我如何在这里做同样的事情? (只是“Read me please!”):

"{\"Result\":
    {    
    \"aString\":\"Read me please!\",
    \"anotherString\":\"Dont read me!\"
    }    
}"

如果两种方案都有不同的解决方案,我想知道两者。

PS:我不希望将值保存到object / class左右。只是暂时在var readString内。

5 个答案:

答案 0 :(得分:8)

你可以写一个模型:

public class MyModel
{
    public string AString { get; set; }
}

然后使用JSON序列化程序,例如Json.NET

string readString = "{\"aString\":\"Read me please!\"}";
MyModel model = JsonConvert.DeserializeObject<MyModel>(readString);
Console.WriteLine(model.AString);

如果您不想使用第三方解决方案,可以使用内置的JavaScriptSerializer类:

string readString = "{\"aString\":\"Read me please!\"}";
MyModel model = new JavaScriptSerializer().Deserialize<MyModel>(readString);
Console.WriteLine(model.AString);

现在假设你想要处理你的第二个JSON字符串,你可以简单地调整你的模型:

public class Wrapper
{
    public MyModel Result { get; set; }
}

public class MyModel
{
    public string AString { get; set; }
    public string AnotherString { get; set; }
}

然后反序列化到这个包装类:

string readString = ... the JSON string in your second example ...;
Wrapper wrapper = JsonConvert.DeserializeObject<Wrapper>(readString);
Console.WriteLine(wrapper.Result.AString);
Console.WriteLine(wrapper.Result.AnotherString);

更新:

如果您不想反序列化到模型,可以直接执行此操作:

string readString = "{\"aString\":\"Read me please!\"}";
var res = (JObject)JsonConvert.DeserializeObject(readString);
Console.WriteLine(res.Value<string>("aString"));

或内置JavaScriptSerializer类:

string readString = "{\"aString\":\"Read me please!\"}";
var serializer = new JavaScriptSerializer();
var res = (IDictionary<string, object>)serializer.DeserializeObject(readString);
Console.WriteLine(res["aString"]);

答案 1 :(得分:1)

var readString = JObject.Parse(str)["aString"];

或者你的第二个例子:

var readString2 = JObject.Parse(str2)["Result"]["aString"];

答案 2 :(得分:0)

您必须使用Newtonsoft(JSON.NET)来实现这一目标。然后,您可以这样访问您的json属性:

var obj = JsonConvert.DeserializeObject(yourJson);
Console.WriteLine(obj.Result.aString); 

答案 3 :(得分:0)

如果你不想反序列化整个事情,Json.NET还提供了一个JSON读者。例如:

string json = "{\"Result\":     {         \"aString\":\"Read me please!\",     \"anotherString\":\"Dont read me!\"     }            }";

using (var reader = new JsonTextReader(new StringReader(json)))
{
    while (reader.Read())
    {
        if (reader.TokenType == JsonToken.PropertyName && (string)reader.Value == "aString")
        {
            reader.Read();
            Console.Write(reader.Value);
            break;
        }

    }
}
Console.ReadKey();

答案 4 :(得分:0)

我尝试编写一种通用方法,该方法可以读取json字符串的任何部分。我在此线程上尝试了很多答案,但它不适合我的需求。这就是我想出的。我在服务层中使用以下方法从json字符串读取我的配置属性。

    public T getValue<T>(string json,string jsonPropertyName)
    {                      
        var parsedResult= JObject.Parse(json);

        return parsedResult.SelectToken(jsonPropertyName).ToObject<T>();
    }

这就是您将如何使用它:

    var result = service.getValue<List<string>>(json, "propertyName");

因此,您可以使用它来获取json字符串中的特定属性,并将其转换为所需的内容。