2017-01-23 86 views
2

所以我有一個JSON字符串,我只想讀取一個特定的值。我如何從下面的字符串中選擇「Read me please!」?從C#中讀取JSON的具體數值

var readString = /*Read me please!*/ 

JSON字符串:

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

爲了更好地理解,我怎麼做同樣的在這裏? (只是「Read me please!」):

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

如果兩個替代方案有不同的解決方案,我想知道這兩個。

PS:我不希望將值保存到對象/類等左右。只是臨時在var readString內。

+0

如果您知道該值,爲什麼需要閱讀它?除非你正在尋找用戶輸入的json文件?您需要先嚐試解決這個問題,併發布您嘗試過的內容。SO不在這裏只爲你寫代碼 – Takarii

+0

@Takarii我猜在我的問題中,閱讀是錯誤的。我想從json字符串中檢索'Read me please!''進入'var readString =' – user7399041

+0

看看http://www.newtonsoft.com/json –

回答

6

你可以寫一個模型:

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); 

如果你不想使用第三方解決方案,您可以使用內置-in JavaScriptSerializer class:

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); 

UPDATE:

如果你不想反序列化到一個模型,你可以直接做到這一點:

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"]); 
+0

是否可以讀取JSON而不反序列化爲對象/模型?我只想讀臨時價值。 – user7399041

+0

@ user7399041,是的,這是可能的,我會更新我的答案,告訴你如何。 –

+0

@DarinDimitrov - 你的更新答案是否仍然反序列化整個對象?我認爲你必須直接使用'JsonReader'來避免這種情況......如果OP想避免將一個潛在的大對象完全加載到內存中,這可能是相關的。 –

0

你必須使用Newtonsoft(JSON.NET)來實現這一目標。然後,您可以訪問您的JSON屬性是這樣的:

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

你不喜歡,但是你可以讓生活更輕鬆。在c#中已經有了一個內置的版本(用戶不太友好) – Takarii

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

或者你的第二個例子:

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

感謝第二個解決方案,這也起到了作用。 – user7399041

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();