2017-05-23 218 views
0

這聽起來很簡單。但我找不到如何去做。Json.Net反序列化字符串中的JSON字符串

我從api接收到一個壞的json。實際JSON是一個字符串

而不是

[{\"ProductId\":1,\"ProductName\":\"abuka\",\"Rate\":6.00,\"Quantity\":10.000},{\"ProductId\":2,\"ProductName\":\"abuka\",\"Rate\":6.00,\"Quantity\":10.000},{\"ProductId\":3,\"ProductName\":\"abuka\",\"Rate\":6.00,\"Quantity\":10.000}] 

我收到

"[{\"ProductId\":1,\"ProductName\":\"abuka\",\"Rate\":6.00,\"Quantity\":10.000},{\"ProductId\":2,\"ProductName\":\"abuka\",\"Rate\":6.00,\"Quantity\":10.000},{\"ProductId\":3,\"ProductName\":\"abuka\",\"Rate\":6.00,\"Quantity\":10.000}]" 

裏面當我嘗試

JsonConvert.DeserializeObject<List<Product>> (jsonString) 

我得到錯誤Error converting to System.Collections.Generic.List

如何C我在解串之前將它解壓縮爲一個有效的JSON字符串?

+0

是反斜線* *肯定有,或者是你在調試器中看到這一點? –

+3

您可以隨時回到API的創建者,並要求他們創建有效的輸出。我確定有些文檔是關於什麼是有效的json(並且轉義引號可能無效)。備份您的研究,並鏈接到各種不會解碼API輸出的網站。 – Neil

+0

@JonSkeet不是來自調試器。這是我得到答覆的方式。我在Rest客戶端 – HeisenBerg

回答

2

如果你有一個值爲「串行化爲JSON的字符串」,那麼只需先反序列化即可。假設你的字符串開始真正和一個雙引號結束,你應該罰款叫JsonConvert.DeserializeObject<string>做到這一點的解包:

using System; 
using System.IO; 
using Newtonsoft.Json; 

public class Model 
{ 
    public string Foo { get; set; } 
} 

public class Test 
{ 
    static void Main() 
    { 
     string json = "\"{\\\"foo\\\": \\\"bar\\\"}\""; 
     Console.WriteLine($"Original JSON: {json}");   
     string unwrappedJson = JsonConvert.DeserializeObject<string>(json); 
     Console.WriteLine($"Unwrapped JSON: {unwrappedJson}"); 
     Model model = JsonConvert.DeserializeObject<Model>(unwrappedJson); 
     Console.WriteLine($"model.Foo: {model.Foo}"); 
    } 
} 
+0

這很有效。謝謝 – HeisenBerg

1

感謝喬恩斯基特。參考你的答案,在應用程序中沒有使用「Newtonsoft.Json」的用戶,但是提供數據的Web API在下面使用「Newtonsoft.Json」的用戶可能會有所幫助。

實施例:

在WEB API - 「Newtonsoft.Json」 使用

中的應用(可能是MVC/ASP.NET的WebForms)消耗WEB API,不使用 「Newtonsoft.Json」 。因此,他們可以參考「System.Web.Extensions」並使用using System.Web.Script.Serialization來解除json數據的限制。

using System.Collections.Generic; 
using System.Web.Script.Serialization; 

namespace DesrializeJson1ConsoleApp 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      string jsonstring = "\"[{\\\"ProductId\\\":1,\\\"ProductName\\\":\\\"abuka\\\",\\\"Rate\\\":6.00,\\\"Quantity\\\":10.000},{\\\"ProductId\\\":2,\\\"ProductName\\\":\\\"abuka\\\",\\\"Rate\\\":6.00,\\\"Quantity\\\":10.000},{\\\"ProductId\\\":3,\\\"ProductName\\\":\\\"abuka\\\",\\\"Rate\\\":6.00,\\\"Quantity\\\":10.000}]\""; 
      var serializer = new JavaScriptSerializer(); 
      var jsonObject = serializer.Deserialize<string>(jsonstring); 
      List<Product> lstProducts = serializer.Deserialize<List<Product>>(jsonObject); 
      foreach(var item in lstProducts) 
      { 
       Console.WriteLine("ProductId :" + item.ProductId); 
       Console.WriteLine("ProductName :" + item.ProductName); 
       Console.WriteLine("Rate :" + item.Rate); 
       Console.WriteLine("Quantity :" + item.Quantity); 
       Console.WriteLine("--------------------------"); 
      } 
      Console.Read(); 
     } 
    } 
    public class Product 
    { 
     public int ProductId { get; set; } 
     public string ProductName { get; set; } 
     public double Rate { get; set; } 
     public double Quantity { get; set; } 
    } 

} 

輸出

enter image description here