2011-12-07 128 views
0

我有返回JSON對象列表Web服務......比如如下:轉換對象列表

[ 
    { 
     \"ItemId\":22, 
     \"ItemName\":\"ASA 5505\", 
     \"AssetNmbr\":\"\", 
     \"EmployeeId\":\"\", 
     \"Type\":\"\", 
     \"Category\":\"\", 
     \"PurchaseDt\":\"\", 
     \"PurchaseBy\":null, 
     \"IssueDt\":\"\", 
     \"IssueBy\":null, 
     \"Price\":\"300.00\", 
     \"SerialNmbr\":\"JMX1538408E\", 
     \"MacAddress\":null, 
     \"LocationNm\":\"Stock\", 
     \"Notes\":null 
    } 
] 

什麼是這個字符串轉換成JSON對象名單的最好辦法?標準Java庫中是否有內置的東西?我嘗試使用Gson,但我沒有好的結果。

+1

這是json的響應是你從服務器?那就錯了。你可以在這裏查看:http://jsonlint.com/ –

+0

是的,我從WCF服務發送它,用C#編寫。它使用ObjectServices列表並使用JavaScriptSerializer轉換整個列表。 – Cody

回答

4

在android中有inbuild類來處理json解析。

關於你提到的例子中,[在你的字符串啓動,這樣就意味着它是數組,所以你已經開始喜歡如下

JSONArray start_object=new JSONArray(inputString); 
JSONObject jObject = start_object.getJSONObject(0); 
String itemid= jObject.getString("Itemid"); 

///等

+1

+1。還有博士,你可以通過這個例子:[Android JSON解析示例](http://goo.gl/JsDut) –

1

我使用GSON嘗試,但我沒有好的結果。

幸運的是,與Jackson或Gson的解決方案相當容易。以下兩個示例演示了這兩個API。

JSON輸入:

[ 
    { 
     "ItemId":22, 
     "ItemName":"ASA 5505", 
     "AssetNmbr":"", 
     "EmployeeId":"", 
     "Type":"", 
     "Category":"", 
     "PurchaseDt":"", 
     "PurchaseBy":null, 
     "IssueDt":"", 
     "IssueBy":null, 
     "Price":"300.00", 
     "SerialNmbr":"JMX1538408E", 
     "MacAddress":null, 
     "LocationNm":"Stock", 
     "Notes":null 
    }, 
    { 
     "ItemId":11, 
     "ItemName":"QRQ 1234", 
     "AssetNmbr":"A1", 
     "EmployeeId":"42", 
     "Type":"BIG", 
     "Category":"ORANGE", 
     "PurchaseDt":"yesterday", 
     "PurchaseBy":null, 
     "IssueDt":"", 
     "IssueBy":null, 
     "Price":"1.00", 
     "SerialNmbr":"CJEUI323EK22", 
     "MacAddress":null, 
     "LocationNm":"Purple", 
     "Notes":"the quick brown fox..." 
    } 
] 

一個匹配的Java數據結構(反序列化):

class Item 
{ 
    int ItemId; 
    String ItemName; 
    String AssetNmbr; 
    String EmployeeId; 
    String Type; 
    String Category; 
    String PurchaseDt; 
    String PurchaseBy; 
    String IssueDt; 
    String IssueBy; 
    String Price; 
    String SerialNmbr; 
    String MacAddress; 
    String LocationNm; 
    String Notes; 

    @Override 
    public String toString() 
    { 
    return String.format("Item: ItemId=%d, ItemName=%s, Price=%s, SerialNmbr=%s", ItemId, ItemName, Price, SerialNmbr); 
    } 
} 

傑克遜:

import java.io.File; 
import java.util.List; 

import org.codehaus.jackson.annotate.JsonAutoDetect.Visibility; 
import org.codehaus.jackson.annotate.JsonMethod; 
import org.codehaus.jackson.map.ObjectMapper; 
import org.codehaus.jackson.type.TypeReference; 

public class JacksonFoo 
{ 
    public static void main(String[] args) throws Exception 
    { 
    ObjectMapper mapper = new ObjectMapper().setVisibility(JsonMethod.FIELD, Visibility.ANY); 

    List<Item> items = mapper.readValue(new File("input.json"), new TypeReference<List<Item>>(){}); 
    System.out.println(items); 
    // output: 
    // [Item: ItemId=22, ItemName=ASA 5505, Price=300.00, SerialNmbr=JMX1538408E, 
    // Item: ItemId=11, ItemName=QRQ 1234, Price=1.00, SerialNmbr=CJEUI323EK22] 
    } 
} 

隨着GSON:

import java.io.FileReader; 
import java.util.List; 

import com.google.gson.Gson; 
import com.google.gson.reflect.TypeToken; 

public class GsonFoo 
{ 
    public static void main(String[] args) throws Exception 
    { 
    Gson gson = new Gson(); 

    List<Item> items = gson.fromJson(new FileReader("input.json"), new TypeToken<List<Item>>(){}.getType()); 
    System.out.println(items); 
    // output: 
    // [Item: ItemId=22, ItemName=ASA 5505, Price=300.00, SerialNmbr=JMX1538408E, 
    // Item: ItemId=11, ItemName=QRQ 1234, Price=1.00, SerialNmbr=CJEUI323EK22] 
    } 
} 

注意:不是字符串和INT其他Java數據類型可以用於Item領域。例如,Jackson和Gson都提供了一些內置支持來自動將格式正確的JSON字符串綁定到java.util.Date