2013-01-03 63 views
7

Tôi nhận được lỗi sau khi tôi thử và phân tích cú pháp JSON của tôi sử dụng Newtonsoft.Json sử dụnglỗi phân tích cú pháp JSON sử dụng Newtonsoft.Json

Response result = JsonConvert.DeserializeObject<Response>(unfilteredJSONData); 

Can not add property string to Newtonsoft.Json.Linq.JObject. Property with the same name already exists on object.

Tôi không có kiểm soát đối với thức ăn chăn nuôi JSON và họ chỉ cần thêm flags1flags2. Các chuỗi trùng lặp dường như gây ra lỗi, nhưng tôi không có bất kỳ ý tưởng tốt về cách giải quyết nó. Mã này đã hoạt động tốt cho đến khi thêm các trường mới.

Cập nhật:


Lỗi đầu tiên là do sử dụng một phiên bản cũ của JSON.net. Đã có phiên bản tích hợp với hệ thống CMS tôi đang sử dụng và phiên bản 3.5. Khi tôi sử dụng 4,5, tôi nhận được một lỗi mới:

Can not add Newtonsoft.Json.Linq.JValue to Newtonsoft.Json.Linq.JObject.

Hóa ra JSON của tôi không giống với định dạng mà tôi đang xử lý. Xin lưu ý bản cập nhật. Lỗi này có vẻ được gây ra ở đây:

"flags1": { 
    "string": "text", 
    "string": "text" 
}, 

các JSON là:

lớp
{ 
    "result": 
    { 
     "lookups": 
     [ 
      { 
       "groups": 
       [ 
        { 
         "item0": "text", 
         "item1": "text", 
         "item2": 0, 
         "item3": 0, 
         "item4": 11.5, 
         "item5": true 
        }, 
        { 
         "item6": "text", 
         "oddName": "text" 
        }, 
        { 
         "item7": { 
          "subitem0": "text", 
          "subitem1": 0, 
          "subitem2": true 
         }, 
         "item8": { 
          "subitem0": "string", 
          "subitem1": 0, 
          "subitem2": true 
         } 
        }, 
        { 
         "url": "http://google.com", 
         "otherurl": "http://yahoo.com", 
         "alturllist": [], 
         "altotherurl": [] 
        }, 
        {}, 
        { 
         "flags1": { 
          "string": "text" 
         }, 
         "flags2": { 
          "string": "text" 
         } 
        } 
       ] 
      }, 
      { 
       "groups": 
       [ 
        { 
         "item0": "text", 
         "item1": "text", 
         "item2": 0, 
         "item3": 0, 
         "item4": 11.5, 
         "item5": true 
        }, 
        { 
         "item6": "text", 
         "oddName": "text" 
        }, 
        { 
         "item7": { 
          "subitem0": "text", 
          "subitem1": 0, 
          "subitem2": true 
         }, 
         "item8": { 
          "subitem0": "string", 
          "subitem1": 0, 
          "subitem2": true 
         } 
        }, 
        { 
         "url": "http://google.com", 
         "otherurl": "http://yahoo.com", 
         "alturllist": [], 
         "altotherurl": [] 
        }, 
        {}, 
        { 
         "flags1": { 
          "string": "text", 
          "string": "text" 
         }, 
         "flags2": {} 
        } 
       ] 
      } 
     ] 
    } 
} 

C# là:

// response 
[DataContract] 
public class Response 
{ 
    [DataMember(Name = "result")] 
    public Result result { get; set; } 
} 
[DataContract] 
public class Result 
{ 
    [DataMember(Name = "lookups")] 
    public List<Item> lookups { get; set; } 
} 
[DataContract] 
public class Item 
{ 
    [DataMember(Name = "groups")] 
    public List<Dictionary<string, object>> groups { get; set; } 
} 

tôi đã đơn giản hóa các JSON và mã ví dụ cho rõ ràng.

Tôi đã bao gồm mã aspx để đơn giản hóa việc tái tạo.

test.aspx

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Test.aspx.cs" Inherits="Test" %> 

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 

<html xmlns="http://www.w3.org/1999/xhtml"> 
<head runat="server"> 
    <title></title> 
</head> 
<body> 
    <form id="form1" runat="server"> 
    <div> 
    <code> 
    <%=response %> 
    </code></div> 
    </form> 
</body> 
</html> 

test.aspx.cs

using System; 
using System.Collections.Generic; 
using System.IO; 
using System.Linq; 
using System.Web; 
using System.Web.UI; 
using System.Web.UI.WebControls; 
using System.Runtime.Serialization; 

using Newtonsoft.Json; 
using Newtonsoft.Json.Linq; 

using NLog; 

public partial class Test : System.Web.UI.Page 
{ 
    public string response = string.Empty; 
    public static string cacheDirPath = HttpRuntime.AppDomainAppPath + "cache\\"; 
    private static Logger log = LogManager.GetLogger("productFeed"); 

    protected void Page_Load(object sender, EventArgs e) 
    { 

     response = readDataFromFile(cacheDirPath + "test2.json"); 
     Response masheryResult = JsonConvert.DeserializeObject<Response>(response); 
    } 
    private string readDataFromFile(string filePath) 
    { 
     string JSONData = string.Empty; 
     try 
     { 
      StreamReader myFile = new StreamReader(filePath); 

      JSONData = myFile.ReadToEnd(); 

      myFile.Close(); 
     } 
     catch (Exception e) 
     { 
      log.Warn(e.Message); 
     } 

     return JSONData; 
    } 
} 

// response 
[DataContract] 
public class Response 
{ 
    [DataMember(Name = "result")] 
    public Result result { get; set; } 
} 
[DataContract] 
public class Result 
{ 
    [DataMember(Name = "lookups")] 
    public List<Item> lookups { get; set; } 
} 
[DataContract] 
public class Item 
{ 
    [DataMember(Name = "groups")] 
    public List<Dictionary<string, object>> groups { get; set; } 
} 
+0

Không có vấn đề ở đây với ví dụ của bạn JSON. Nó deserializes tốt. –

+1

Không có vấn đề gì đối với tôi. Bạn đang sử dụng phiên bản Json.NET nào, tôi đang sử dụng 4.5.0.0 từ nuget. Là json ở trên văn bản chính xác bạn có vấn đề deserialisation với, hoặc chỉ là một đại diện. –

+0

@Robert Slaney - Tôi đã sử dụng dll được tích hợp vào hệ thống CMS của Ektron. Phiên bản 3.5, khi tôi sử dụng phiên bản nuget 4.5 lỗi sẽ biến mất. Một lỗi khác xuất hiện mà tôi phải xem xét. 'Không thể thêm Newtonsoft.Json.Linq.JValue vào Newtonsoft.Json.Linq.JObject.' Đây không phải là mã chính xác không may những gì tôi đang đối phó với nhiều hơn nữa unruly. Cảm ơn bạn. – whoacowboy

Trả lời

12

Cả các thuộc tính trong đối tượng "flags1" được đặt tên "chuỗi", bạn không thể xác định một tài sản hai lần.

Chỉnh sửa: Dường như, ít nhất là trong phiên bản mới nhất của gói nuget, JObject.Parse bỏ qua lỗi và phân tích cú pháp dữ liệu đúng cách! Tôi hy vọng bạn có thể làm cho công việc đó cho bạn.

Dưới đây là một ví dụ về cách bạn có thể làm điều đó:

Response result = JObject.Parse(unfilteredJSONData).ToObject<Response>(); 
+0

Cảm ơn bạn đã phản hồi, nhưng tôi không kiểm soát được JSON. Có một công việc xung quanh một cách tình cờ? – whoacowboy

+0

Tôi đã chỉnh sửa câu trả lời của mình bằng cách giải quyết :) –

+2

Cảm ơn bạn đã làm việc. – whoacowboy

1

Trong bổ sung cho Connor Hilarides câu trả lời, nó có thể được sử dụng bao gồm các mảng:

JToken resultToken = JToken.Parse(unfilteredJSONData); 
Các vấn đề liên quan