2013-01-03 26 views
7

otrzymuję następujący błąd, gdy próbuję i analizować moje JSON za pomocą Newtonsoft.Json użyciuBłędy analizowania JSON wykorzystujące 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.

mam żadnej kontroli nad paszy JSON i po prostu dodaje flags1 i flags2. Wydaje się, że duplikowany ciąg powoduje błąd, ale nie mam dobrego pomysłu, jak go rozwiązać. Ten kod działał dobrze, aż do dodania nowych pól.

Aktualizacja:


Pierwszy błąd został spowodowany użyciem nieaktualnej wersji Json.NET. Była wbudowana wersja z systemem CMS, którego używam i miała 3,5. Gdy używam 4.5 dostaję nowy błąd:

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

Okazuje się mój JSON poniżej nie był dokładnie taki sam format jak to, co mam do czynienia. Zwróć uwagę na aktualizację. Błąd wydaje się być tutaj spowodowane:

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

JSON jest:

# klas
{ 
    "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": {} 
        } 
       ] 
      } 
     ] 
    } 
} 

katalogu C są:

// 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; } 
} 

mam uproszczony przykład JSON i kod dla jasności.

Dołączyłem kod aspx, aby uprościć odtwarzanie.

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

Żadnych problemów tu ze swoim przykładzie JSON. To deserializuje się dobrze. –

+1

Żadnych problemów również dla mnie. Jakiej wersji Json.NET używasz, używam 4.5.0.0 z nuget. Czy powyższy json to dokładny tekst, z którym masz problem deserialization lub po prostu reprezentację. –

+0

@Robert Slaney - Używałem biblioteki DLL wbudowanej w system CMS firmy Ektron. Wersja 3.5, gdy użyłem wersji 4.5 nuget, błąd zniknął. Pojawia się kolejny błąd, który muszę przeanalizować. "Nie można dodać Newtonsoft.Json.Linq.JValue do Newtonsoft.Json.Linq.JObject." To nie jest dokładny kod, niestety to, z czym mam do czynienia, jest znacznie bardziej niesforne. Dziękuję Ci. – whoacowboy

Odpowiedz

12

Zarówno właściwości w "flags1" obiektu są nazywane "string", nie można określić właściwości dwukrotnie.

Edycja: Wygląda na to, że JObject.Parse pomija błąd i poprawnie analizuje dane! Mam nadzieję, że możesz wykonać tę pracę za ciebie.

Oto przykład tego, jak można to zrobić:

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

Dzięki za odpowiedź, ale nie mam kontroli nad JSON. Czy istnieje przypadek? – whoacowboy

+0

Edytowałem swoją odpowiedź z obejściem :) –

+2

Dzięki, że zadziałało. – whoacowboy

1

W dodatkowy do Connor Hilarides odpowiedź, może być stosowany łącznie z tablicami:

JToken resultToken = JToken.Parse(unfilteredJSONData); 
Powiązane problemy